`

初探WINDOWS下IME编程

阅读更多

初探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编程》是一本专注于探讨如何在Windows操作系统环境下进行输入法(IME,Input Method Editor)开发的专业书籍。IME是操作系统中一个至关重要的组件,它负责处理用户输入,特别是对于非拉丁字符集的...

    商业编程-源码-《初探WINDOWS下IME编程》配套源代码.zip

    《初探WINDOWS下IME编程》配套源代码是一个深入学习Windows平台输入法引擎(IME)开发的重要资源。IME,全称为Input Method Editor,是操作系统中用于输入非拉丁字符集的软件组件,尤其对于中文、日文、韩文等亚洲...

    源码附件:VC--初探WINDOWS下的IME编程.rar_VC i_ime_注册表

    初探WINDOWS下IME编程源码: 大家知道,DELPHI许多控件有IME属性。这么好用的东西VC可没自带,怎么办呢?其实,可通过注册表,用API实现。下面说一下本人对IME的研究结果,并提供示例工程供大家参考:

    初探Delphi模式编程

    **初探Delphi模式编程** Delphi是一种基于Object Pascal的集成开发环境(IDE),由Embarcadero Technologies公司开发,广泛用于Windows平台上的应用程序开发。它以其高效、快速的编译器和直观的可视化设计界面而...

    基于计算机软件开发的JAVA编程应用初探.pdf

    在计算机软件开发中,Java编程语言的应用是极为广泛与深远的。Java语言自问世以来就以其独特的特性和优势吸引了大量开发者的注意,这些特性包括但不限于其平台独立性、内存管理优化、面向对象的编程设计以及其强大的...

    基于图形化编程技术的单片机课程教学初探.pdf

    文章《基于图形化编程技术的单片机课程教学初探》针对这一问题,提出了将图形化编程技术应用于STM32系列单片机课程的教学中。 图形化编程语言相较于传统的汇编语言和C语言,具有编程简单、直观易懂的优势,尤其是在...

    C#网络编程C#网络编程初探

    ### C#网络编程初探——理解关键概念与实践 #### 一、基础知识 **C#**作为一种现代化的面向对象编程语言,与C++等其他语言相比有着显著的不同之处。其中一个重要区别在于,C#并不自带类库,而是依赖于.NET框架提供...

    生物芯片原理初探.ppt编程资料

    生物芯片原理初探.ppt编程资料

    初探DELPHI模式编程II

    “初探DELPHI模式编程II”可能是主教程文档,涵盖了多种设计模式的实例分析和代码实现。这份教程可能会从基础的单例模式开始,逐步介绍更复杂的模式,如装饰器、观察者和策略模式。每种模式都会解释其背后的意图、...

    基于计算机软件开发的JAVA编程应用初探.zip

    这份资料"基于计算机软件开发的JAVA编程应用初探"将引领我们深入理解Java在软件开发中的核心概念、应用领域以及实战技巧。 首先,Java的基础知识是学习的重点。Java是一种强类型、静态类型的编程语言,它的语法与...

    初探Delphi中的插件编程

    【初探Delphi中的插件编程】 在Delphi编程中,插件结构是一种常见的软件设计模式,它允许程序通过加载动态链接库(DLL)来扩展功能,而无需修改或重新编译主应用程序。这种设计模式尤其适用于大型MIS系统,随着功能的...

    C#网络编程初探

    ### C#网络编程初探——理解关键概念与实践 #### 一、引言 随着互联网技术的飞速发展,网络编程已经成为现代软件开发不可或缺的一部分。C#作为一种强大的面向对象编程语言,凭借其丰富的.NET Framework SDK支持,...

    C_网络编程初探C_网络编程初探

    ### C网络编程初探:深入理解C#网络编程的核心概念与实践 在探索C#网络编程的世界里,首要任务是理解其与C++等其他语言的显著差异——C#依赖于.NET Framework SDK作为其核心类库,特别是针对网络编程部分,系统提供...

    Windows系统服务初探

    在Windows操作系统中,系统服务是后台运行的程序,它们在用户登录之前启动,为系统提供必要的功能,并且可以在用户不直接交互的情况下运行。本篇文章将深入探讨Windows系统服务的原理、创建过程以及服务间的通信机制...

    c#网络编程初探

    ### C#网络编程初探——Socket详解 #### 一、引言 随着互联网技术的不断发展,网络编程成为了软件开发中不可或缺的一部分。对于.NET开发者来说,掌握C#中的网络编程技术尤为重要。本文旨在深入探讨C#中的网络编程...

    windows内核编程day01.rar

    《Windows内核编程初探——Day01课程概述与基础概念》 Windows内核编程是计算机科学中的一个重要领域,它涉及到操作系统最核心的部分,包括系统调用、内存管理、进程和线程调度、中断处理等关键功能。对于任何希望...

    c++多线程编程初探

    #### 一、Windows下的多线程基础 首先,我们需要了解的是,在Windows环境下实现多线程编程主要依赖于`CreateThread`函数。这是一个非常关键的API函数,用于创建一个新的线程。 ##### CreateThread函数详解 ```cpp...

    C#网络编程初探[参照].pdf

    《C#网络编程初探》 C#作为.NET框架的核心语言,其网络编程能力主要依赖于.NET Framework SDK提供的类库。在SDK中,有两个关键的命名空间用于网络编程,即"System.Net"和"System.Net.Sockets"。这两个命名空间提供...

Global site tag (gtag.js) - Google Analytics