【问题标题】:How to convert a message from a WH_KEYBOARD_LL to corespondig unicode char如何将消息从 WH_KEYBOARD_LL 转换为 corespondig unicode char
【发布时间】:2011-03-04 20:23:13
【问题描述】:

你好 我正在编写一个多语言应用程序,并且正在使用 WH_KEYBOARD_LL 钩子。我不关心为什么要使用钩子,我尝试了多种方法,但这是最简单和最快的方法。 现在在钩子过程中

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

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

谢谢。

【问题讨论】:

    标签: c# c++ windows


    【解决方案1】:

    ToUnicodeEx()。除非键盘布局简单,否则它在实践中不起作用。死钥匙是杀死你的东西。 Michael Kaplan 写了一封11 part blog serial 关于它但因为他没有完成它就放弃了。看看你能从中挽救什么,但不要抱太大希望。中文使用 IME,即输入法编辑器。软件,我觉得是靠笔画造字的。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        这种转换很复杂。即使是简单的死键也很难处理,而且使用 IME 时会变得非常难看。

        考虑在输入控件接收到已转换字符的位置截取消息。但当然,这对代码来说更难看。

        问题是正常的消息挂钩需要将dll注入目标进程,并且该dll不应该用C#编写。但也许还有其他一些无需 dll 注入即可工作的消息拦截 API。

        【讨论】:

        • 你们这些男人,在阅读了 Hans Passant 的回答后,我的想法和你一样。我会尝试两个。
        • @geth 问题是你不应该简单地在 C# 中编写一个全局消息挂钩。
        猜你喜欢
        • 2012-06-17
        • 2021-12-26
        • 1970-01-01
        • 1970-01-01
        • 2018-10-08
        • 2011-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多