我遇到了一个可重现的错误,对我来说并没有多大意义。希望有人知道更多关于Windows下键盘输入的内部结构(我正在使用Windows 7),并且可以指出我如何解决它的正确方向。现在看来,我真的不知道应该从哪里开始看。
我的应用程序使用MouseKeyboardActivityMonitor库创建全局键盘钩子。这对我来说很好,但我很快收到了使用不同键盘输入语言的人的错误报告。当他们用重音字母写字母时,例如。 ë和ê,它们分别显示为¨e和^^ e 。 This bug is also reported on the library's website,但尚未解决。
为了尝试重现该错误,我在现有的“英语(美国)”旁边设置了另一种输入语言“荷兰语(比利时)”。经过一番玩弄后,我发现了以下内容:
安装挂钩的应用程序具有焦点,并且语言设置为“英语(美国)”时,不会发生此错误。在任何其他应用程序(例如记事本)中编写并使用'荷兰语(比利时)'来编写特殊字符。当安装钩子的应用程序具有焦点,并且语言设置为“荷兰语(比利时)”时,会发生该错误。
我正在寻找两者如何相关的任何线索。也许我需要在键盘钩子库中引入一些额外的检查? source code of the keyboard hook is available on line。
答案 0 :(得分:0)
似乎您的应用程序中未更新输入语言。查看您正在使用的库的源代码,似乎他们使用此调用来获取正确的键盘布局:
internal static extern uint GetKeyboardLayout( int dwLayout );
此方法的documentation强调:
输入区域设置标识符是一个比键盘更广泛的概念 布局,因为它也可以包含语音到文本转换器, 输入法编辑器(IME)或任何其他形式的输入。自从 键盘布局可以动态更改,缓存的应用程序 有关当前键盘布局的信息应该处理 WM_INPUTLANGCHANGE消息,用于通知输入的变化 语言。
但是,基于对代码的快速浏览,库似乎没有响应此WM_INPUTLANGCHANGE
消息,这可能会导致此行为
此外,这是一个有用的链接an explanation Windows如何处理键盘