作者:Walzer
日期:2005.9.16
花了些工夫后,我们终于能在WINCE里随时用HOT KEY切出中文输入法了。内容都在注册表里,不过需要翻译出来才能看破。这部分在WIN XP和WINCE里是基本一致的。
进到 [HKEY_CURRENT_USER \ Control Panel \ Input Method \ Hot Keys] 里面.
这里有到一堆数字00000010 ~ 00000012, 00000100等, 这些在WINCE HELP里能找到说明, 但最全的说明在wince500\public\common\sdk\inc\imm.h里
// Windows for Simplified Chinese Edition hot key ID from 0x10 - 0x2F
#define IME_CHOTKEY_FIRST 0x10
#define IME_CHOTKEY_IME_NONIME_TOGGLE 0x10
#define IME_CHOTKEY_SHAPE_TOGGLE 0x11
#define IME_CHOTKEY_SYMBOL_TOGGLE 0x12
#define IME_CHOTKEY_LAST 0x2f
// Windows for Japanese Edition hot key ID from 0x30 - 0x4F
#define IME_JHOTKEY_FIRST 0x30
#define IME_JHOTKEY_CLOSE_OPEN 0x30
#define IME_JHOTKEY_LAST 0x4f
// Windows for Korean Edition hot key ID from 0x50 - 0x6F
#define IME_KHOTKEY_FIRST 0x50
#define IME_KHOTKEY_SHAPE_TOGGLE 0x50
#define IME_KHOTKEY_HANJACONVERT 0x51
#define IME_KHOTKEY_ENGLISH 0x52
#define IME_KHOTKEY_LAST 0x6f
// Windows for Traditional Chinese Edition hot key ID from 0x70 - 0x8F
#define IME_THOTKEY_FIRST 0x70
#define IME_THOTKEY_IME_NONIME_TOGGLE 0x70
#define IME_THOTKEY_SHAPE_TOGGLE 0x71
#define IME_THOTKEY_SYMBOL_TOGGLE 0x72
#define IME_THOTKEY_LAST 0x8f
// direct switch hot key ID from 0x100 - 0x11F
#define IME_HOTKEY_DSWITCH_FIRST 0x100
#define IME_HOTKEY_DSWITCH_LAST 0x11F
// IME private hot key from 0x200 - 0x21F
#define IME_HOTKEY_PRIVATE_FIRST 0x200
#define IME_ITHOTKEY_RESEND_RESULTSTR 0x200
#define IME_ITHOTKEY_PREVIOUS_COMPOSITION 0x201
#define IME_ITHOTKEY_UISTYLE_TOGGLE 0x202
#define IME_HOTKEY_PRIVATE_LAST 0x21F
这样就很显然了. XP里也一样,10就是切出中文输入法, 11是全角/半角字切换, 12是标点符号的全半角切换. 比如我们要在CE里做启动/关闭中文简体输入法的热键,那么它就在Hot Keys\00000010下面. 点进去后有三个值
VK = 32
KM = 49154
Ime = 3758163972
缩写,十进制数, 都是蒙人的东西. 对照在WIN XP下, 这三个值就是
Virtual Key = 20 00 00 00
Key Modifiers = 02 C0 00 00
Target IME = 00 00 00 00
这比CE里的好理解多了. 首先VK = 0x20 就是SPACE键. Target IME = 3758163972 = 0xE0010804. 0804让我想到了简体中文的LANGUAGE ID. 在CE的注册表里搜一下, 位于[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Layouts]下面,有e0010804和00000409两个项, 很显然0409就是英文的Language ID. 那么从项里面的内容来看, e0010804代表的就是中文全拼输入法, 它将调用chsime03.dll, 键盘布局0409为标准键盘. 00000409就是普通的英文输入了,没有输入法, 就用的kbdmouse.dll.
那么Key Modifiers怎么理解呢? 仍然是在public\common\sdk\inc\imm.h里找到了这张表
// the modifiers of hot key
#define MOD_ALT 0x0001
#define MOD_CONTROL 0x0002
#define MOD_SHIFT 0x0004
#define MOD_LEFT 0x8000
#define MOD_RIGHT 0x4000
#define MOD_ON_KEYUP 0x0800
#define MOD_IGNORE_ALL_MODIFIER 0x0400
所以KM的值是上面这几个值逻辑与的结果. 比如上面那个KM = 49154 = 0xC002 = MOD_LEFT | MOD_RIGHT | MOD_CONTROL .那么配合VK=0x20, 也就是说左边或右边任意一个CTRL键, 再同时按下SPACE键, 就实现了IME_CHOTKEY_IME_NONIME_TOGGLE的功能. 即切换出简体中文输入法.
下面的其他项都可以类似地理解了。
另外有个地方在以后也许会有用 ms-help://MS.WindowsCE.500/wceinternational5/html/wce50grfInputMethodManagerIMMFunctions.htm 也就是加入Imput Method Managers组件后,可以把这些函数提供给APP用. 浏览器移植中有一块就是浏览器和操作系统输入法的接口函数.
最后顺带讲一下CE上这个猥琐的微软全拼输入法怎么用. 比如现在要输入"傻", 那么首先按CTRL+SPACE切出中文输入法, 然后输入"sha", 再按SPACE. 这时候出现下划虚线的"沙"字, 然后我们得按一下左箭头, 这时就出来选字的框了. 可"傻"不在第一列里, 所以得按下PAGE_DOWN, 然后再按"2"完成.
好吧, 傻了吧? 这只是标准键盘上的操作, 如果在遥控器上
"7" * 5 = S
"4" * 3 = H
"2" * 2 = A
选定 * 1
左箭头 * 1
快进 * 1
"2" * 1
-------------
总计 按遥控器14下
无法忍受吗? 我掏出手机用NOKIA最经典的中文输入法, 输入"傻"字一共按了15次键, 所以各位手里的西红柿和鸡蛋还是留着晚上自己煮汤喝吧~~