初探WINDOWS下IME编程
作者:广东南海市昭信科技有限公司-李建国
大家知道,DELPHI许多控件有IME属性。这么好用的东西VC可没自带,怎么办呢?其实,可通过注册表,用API实现。下面说一下本人对IME的研究结果,并提供示例工程供大家参考:
下载示例工程 10.6K
本文示例程序运行结果如上图
1、将用到的API
RegOpenKey:打开注册表一键
RegQueryValue:查询一键值
RegQueryValueEx:同上
RegCloseKey:关闭打开的键
LoadKeyboardLayout:装载输入法
ActivateKeyboardLayout:激活输入法
2、IME信息在注册表中的位置
在HKEY_USERS:".DEFAULT\keyboard layout\preload"放的是已安装的输入法,下有几个以数字为名的子键,内容是输入法代号(keyboard layout),如"e0040804",其中左4位是设备代码(device identifier),右4位是语言代码(language identifier)。例如上面:左e004指智能ABC,右0804指大陆中文。(详见MSDN)
在HKEY_LOCAL_MACHINE:"System\CurrentControlSet\Control\Keyboard Layouts\"放的是已注册的输入法。他的子键名为输入法代号(keyboard layout),内容为该输入法的ime文件,名称等信息。
3、主要思路
我们可先把已装的输入法枚举出来(从注册表),用户选择其一后,再激活该输入法。
两关键函数:
HKL LoadKeyboardLayout(LPCTSTR pwszKLID,UINT Flags);
第一个参数是待打开的输入法代号,如"e0040804"(智能ABC);
第二个参数是标志位,如KLF_ACTIVATE(激活)。
HKL ActivateKeyboardLayout(HKL hkl,UINT Flags);
第一个参数是打开的输入法句柄(由LoadKeyboardLayout返回);
第二个参数是标志位,如KLF_SETFORPROCESS。(详见MSDN)
4、例子程序
新建一基于对话框的工程,加入一combobox控件,增加控制变量m_cb1。加入一edit控件,增加控制变量m_edt1.对combobox,增加对CBN_SELCHANGE的映射函数OnSelchangeCombo1()。对edit1,增加对EN_SETFOCUOS的SetfocusEdit1().在对话框类头文件的public:下加入数组声明:CString lst[10];
在OnInitDialog()的return前加如下代码:
HKEY hk,hk1;
long cp=16;
char lp[15];
char a[2];
a[0]='1';
a[1]='\0';
CString str,str1;
str=".DEFAULT\\keyboard layout\\preload\\";//已装的输入法。注:win2000有所不同
str+=a;
int i=0;
while(::RegOpenKey(HKEY_USERS,str,&hk)==ERROR_SUCCESS)//打开键
{
a[0]++;//下一子键
str=".DEFAULT\\keyboard layout\\preload\\";
str+=a;
if(::RegQueryValue(hk,NULL,lp,&cp)!=ERROR_SUCCESS)//已装的输入法
MessageBox("Error");
::RegEnumKeyEx
str1="System\\CurrentControlSet\\Control\\Keyboard Layouts\\";//keyboardlayoutLayout
str1+=lp;
lst[i++]=lp;
//打开对应的keyboardlayoutLayout
if(RegOpenKey(HKEY_LOCAL_MACHINE,str1,&hk1)==ERROR_SUCCESS)
{
LPBYTE lpD=new BYTE[80];//DataValue
DWORD lpT=REG_SZ;//DataType
DWORD lpS=80; //DataSize
if(RegQueryValueEx(hk1,"Layout text",NULL,&lpT,lpD,&lpS)!=ERROR_SUCCESS)
MessageBox("Query error",(LPCTSTR)lpD);
m_cb1.AddString((LPCTSTR)lpD);
delete lpD;
}
else MessageBox("open error");
RegCloseKey(hk1);
}
::RegCloseKey(hk);
m_cb1.SetCurSel(0);
在OnSetfocusEdit1()加入如下代码:
CString temp;
temp=m_cb1.GetCurSel()!=CB_ERR?st[m_cb1.GetCurSel()]:"00000409";
HKL hkl;
hkl=LoadKeyboardLayout(temp,KLF_ACTIVATE);//装载输入法
if(hkl==NULL) OnOK();
ActivateKeyboardLayout(hkl,KLF_SETFORPROCESS);//激活输入法
在OnSelchangeCombo1()加入如下代码:
m_edt1.SetFocus();
即可编译运行。
5、注意:win2000下有所不同。注册表HKEY_USERS:".DEFAULT\keyboard layout\preload没有子键只有以数字为名的项,值为输入法代号(keyboard layout)。在示例代码中不仅提供了WIN 9X下的代码,也提供了2000下的相应代码段,具体请参考示例工程。
分享到:
相关推荐
《初探WINDOWS下IME编程》是一本专注于探讨如何在Windows操作系统环境下进行输入法(IME,Input Method Editor)开发的专业书籍。IME是操作系统中一个至关重要的组件,它负责处理用户输入,特别是对于非拉丁字符集的...
《初探WINDOWS下IME编程》配套源代码是一个深入学习Windows平台输入法引擎(IME)开发的重要资源。IME,全称为Input Method Editor,是操作系统中用于输入非拉丁字符集的软件组件,尤其对于中文、日文、韩文等亚洲...
初探WINDOWS下IME编程源码: 大家知道,DELPHI许多控件有IME属性。这么好用的东西VC可没自带,怎么办呢?其实,可通过注册表,用API实现。下面说一下本人对IME的研究结果,并提供示例工程供大家参考:
**初探Delphi模式编程** Delphi是一种基于Object Pascal的集成开发环境(IDE),由Embarcadero Technologies公司开发,广泛用于Windows平台上的应用程序开发。它以其高效、快速的编译器和直观的可视化设计界面而...
在计算机软件开发中,Java编程语言的应用是极为广泛与深远的。Java语言自问世以来就以其独特的特性和优势吸引了大量开发者的注意,这些特性包括但不限于其平台独立性、内存管理优化、面向对象的编程设计以及其强大的...
文章《基于图形化编程技术的单片机课程教学初探》针对这一问题,提出了将图形化编程技术应用于STM32系列单片机课程的教学中。 图形化编程语言相较于传统的汇编语言和C语言,具有编程简单、直观易懂的优势,尤其是在...
### C#网络编程初探——理解关键概念与实践 #### 一、基础知识 **C#**作为一种现代化的面向对象编程语言,与C++等其他语言相比有着显著的不同之处。其中一个重要区别在于,C#并不自带类库,而是依赖于.NET框架提供...
生物芯片原理初探.ppt编程资料
“初探DELPHI模式编程II”可能是主教程文档,涵盖了多种设计模式的实例分析和代码实现。这份教程可能会从基础的单例模式开始,逐步介绍更复杂的模式,如装饰器、观察者和策略模式。每种模式都会解释其背后的意图、...
这份资料"基于计算机软件开发的JAVA编程应用初探"将引领我们深入理解Java在软件开发中的核心概念、应用领域以及实战技巧。 首先,Java的基础知识是学习的重点。Java是一种强类型、静态类型的编程语言,它的语法与...
【初探Delphi中的插件编程】 在Delphi编程中,插件结构是一种常见的软件设计模式,它允许程序通过加载动态链接库(DLL)来扩展功能,而无需修改或重新编译主应用程序。这种设计模式尤其适用于大型MIS系统,随着功能的...
### C#网络编程初探——理解关键概念与实践 #### 一、引言 随着互联网技术的飞速发展,网络编程已经成为现代软件开发不可或缺的一部分。C#作为一种强大的面向对象编程语言,凭借其丰富的.NET Framework SDK支持,...
### C网络编程初探:深入理解C#网络编程的核心概念与实践 在探索C#网络编程的世界里,首要任务是理解其与C++等其他语言的显著差异——C#依赖于.NET Framework SDK作为其核心类库,特别是针对网络编程部分,系统提供...
在Windows操作系统中,系统服务是后台运行的程序,它们在用户登录之前启动,为系统提供必要的功能,并且可以在用户不直接交互的情况下运行。本篇文章将深入探讨Windows系统服务的原理、创建过程以及服务间的通信机制...
### C#网络编程初探——Socket详解 #### 一、引言 随着互联网技术的不断发展,网络编程成为了软件开发中不可或缺的一部分。对于.NET开发者来说,掌握C#中的网络编程技术尤为重要。本文旨在深入探讨C#中的网络编程...
《Windows内核编程初探——Day01课程概述与基础概念》 Windows内核编程是计算机科学中的一个重要领域,它涉及到操作系统最核心的部分,包括系统调用、内存管理、进程和线程调度、中断处理等关键功能。对于任何希望...
#### 一、Windows下的多线程基础 首先,我们需要了解的是,在Windows环境下实现多线程编程主要依赖于`CreateThread`函数。这是一个非常关键的API函数,用于创建一个新的线程。 ##### CreateThread函数详解 ```cpp...
《C#网络编程初探》 C#作为.NET框架的核心语言,其网络编程能力主要依赖于.NET Framework SDK提供的类库。在SDK中,有两个关键的命名空间用于网络编程,即"System.Net"和"System.Net.Sockets"。这两个命名空间提供...