Input Method of Win32 System

本文详细介绍了如何在Windows CE系统中设置中文输入法的热键,并解析了注册表中热键对应的含义及使用方法。

花了些工夫后,我们终于能在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下


本文转自Walzer博客园博客,原文链接:http://www.cnblogs.com/walzer/archive/2006/02/05/325603.html,如需转载请自行联系原作者

System.InvalidOperationException HResult=0x80131509 Message=指定的元素已经是另一个元素的逻辑子元素。请先将其断开连接。 Source=PresentationFramework StackTrace: 在 System.Windows.FrameworkElement.ChangeLogicalParent(DependencyObject newParent) 在 System.Windows.FrameworkContentElement.AddLogicalChild(Object child) 在 System.Windows.LogicalTreeHelper.AddLogicalChild(DependencyObject parent, Object child) 在 System.Windows.Documents.TextContainer.InsertEmbeddedObjectInternal(TextPointer position, DependencyObject embeddedObject) 在 System.Windows.Documents.TextPointer.InsertUIElement(UIElement uiElement) 在 System.Windows.Documents.BlockUIContainer.set_Child(UIElement value) 在 System.Windows.Documents.BlockUIContainer..ctor(UIElement uiElement) 在 MdPass.UI.DrugGudiesForm.Print_Click(Object sender, MouseButtonEventArgs e) 在 D:\vs_work_space\kehuduan\MdPass\UI\DrugGudiesForm.xaml.cs 中: 第 313 行 在 System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget) 在 System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) 在 System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) 在 System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) 在 System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent) 在 System.Windows.UIElement.OnMouseDownThunk(Object sender, MouseButtonEventArgs e) 在 System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget) 在 System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) 在 System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) 在 System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) 在 System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) 在 System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args) 在 System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted) 在 System.Windows.Input.InputManager.ProcessStagingArea() 在 System.Windows.Input.InputManager.ProcessInput(InputEventArgs input) 在 System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport) 在 System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel) 在 System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 在 System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 在 MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 在 MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 在 System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler) 在 System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) 在 MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 在 MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 在 System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 在 System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame) 在 System.Windows.Window.ShowHelper(Object booleanBox) 在 System.Windows.Window.Show() 在 System.Windows.Window.ShowDialog() 此异常最初是在此调用堆栈中引发的: [外部代码] MdPass.UI.DrugGudiesForm.Print_Click(object, System.Windows.Input.MouseButtonEventArgs) (位于 DrugGudiesForm.xaml.cs 中) [外部代码]
07-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值