zoukankan      html  css  js  c++  java
  • 初探WINDOWS下IME编程

    初探WINDOWS下IME编程
    作者:广东南海市昭信科技有限公司-李建国 

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

    下载示例工程 10.6K

    初探WINDOWS下IME编程 - 作者:李建国 - wan_gn - 火边的冰块
    本文示例程序运行结果如上图

    1、将用到的API


    RegOpenKey:打开注册表一键
    RegQueryValue:查询一键值
    RegQueryValueEx:同上
    RegCloseKey:关闭打开的键

    LoadKeyboardLayout:装载输入法
    ActivateKeyboardLayout:激活输入法

    2、IME信息在注册表中的位置

    在HKEY_USERS:".DEFAULTkeyboard layoutpreload"放的是已安装的输入法,下有几个以数字为名的子键,内容是输入法代号(keyboard layout),如"e0040804",其中左4位是设备代码(device identifier),右4位是语言代码(language identifier)。例如上面:左e004指智能ABC,右0804指大陆中文。(详见MSDN)
    在HKEY_LOCAL_MACHINE:"SystemCurrentControlSetControlKeyboard 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]='';  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?lst[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:".DEFAULTkeyboard layoutpreload没有子键只有以数字为名的项,值为输入法代号(keyboard layout)。在示例代码中不仅提供了WIN 9X下的代码,也提供了2000下的相应代码段,具体请参考示例工程。




    引文来源  初探WINDOWS下IME编程 - 作者:李建国

    http://blog.163.com/wan_gn/blog/static/39515821200881062754773/

  • 相关阅读:
    (二分查找 拓展) leetcode 69. Sqrt(x)
    (二分查找 拓展) leetcode 162. Find Peak Element && lintcode 75. Find Peak Element
    (链表) lintcode 219. Insert Node in Sorted Linked List
    (二分查找 拓展) leetcode 34. Find First and Last Position of Element in Sorted Array && lintcode 61. Search for a Range
    (最短路 Floyd) P2910 [USACO08OPEN]寻宝之路Clear And Present Danger 洛谷
    (字符串 数组 递归 双指针) leetcode 344. Reverse String
    (二叉树 DFS 递归) leetcode 112. Path Sum
    (二叉树 DFS 递归) leetcode 101. Symmetric Tree
    (二叉树 递归) leetcode 144. Binary Tree Preorder Traversal
    (二叉树 递归 DFS) leetcode 100. Same Tree
  • 原文地址:https://www.cnblogs.com/findumars/p/7152624.html
Copyright © 2011-2022 走看看