如何将消息从WH_KEYBOARD_LL转换为corespondig unicode char

时间:2011-03-04 20:23:13

标签: c# c++ windows

您好 我正在编写一个多语言应用程序,我正在使用WH_KEYBOARD_LL挂钩。我没有说明为什么我使用钩子,我尝试了多种东西,但这是最简单,最快速的方法。 现在在钩子proc里面

LRESULT CALLBACK LowLevelKeyboardProc(int nCode,WPARAM wParam, LPARAM lParam);

我在KBDLLHOOKSTRUCT参数中收到一个LPARAM,其中包含所按键的信息。是否有任何方法可以根据用户为ex设置的当前键盘布局在unicode字符中对此信息进行协调。如果用户有中文键盘布局设置并且他提出了“a”键,那么我会收到一个包含“a”键扫描码的KBDLLHOOKSTRUCT,我需要将此扫描码转换为相应的unicode字符。我知道这是可能的,因为你可以在Microsoft Word中用中文写,我只是想不出怎么做。

感谢。

3 个答案:

答案 0 :(得分:2)

ToUnicodeEx()。除非键盘布局简单,否则它在实践中不起作用。死钥匙会杀死你。迈克尔·卡普兰(Michael Kaplan)写了一篇关于它的11 part blog serial,但他只是放弃了而没有完成它。看看你可以从中挽救什么,但不要抱有希望。中文使用输入法编辑器IME。软件,我认为它是通过笔画建立起来的。

答案 1 :(得分:0)

可能是MapVirtualKeyEx或ToUnicodeEx。无论如何,我认为MSDN的键盘输入部分的一个函数将包含一个正确的函数(它们的列表很短)。

答案 2 :(得分:0)

转换很复杂。即使是简单的死键也很难处理,使用IME时非常难看。

考虑拦截输入控件接收已转换字符的消息。但当然,编码更加丑陋。

问题是普通的消息钩子需要dll注入到目标进程中,并且该dll不应该用C#编写。但是也许还有一些其他的消息拦截API在没有dll注入的情况下工作。