www.Walzer.cn - Tech & Management Blog

Focus on mobile dev
本博客文章,未在标题中写明转载的, 均为原创.
所谓高手,也就是熟悉别人制定的游戏规则、并且能在规则内跳舞的人。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Input Method of Win32 System

Posted on 2006-02-05 13:01  Walzer  阅读(2210)  评论(4编辑  收藏  举报

作者: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次键, 所以各位手里的西红柿和鸡蛋还是留着晚上自己煮汤喝吧~~