1

我遇到了一个可重现的错误,这对我来说真的没有意义。希望有人更多地了解 Windows 下键盘输入的内部结构(我使用的是 Windows 7),并可以为我指出如何解决它的正确方向。就目前而言,我真的不知道应该从哪里开始寻找。

我的应用程序使用MouseKeyboardActivityMonitor库创建了一个全局键盘挂钩。这对我来说工作得很好,但我很快收到了使用不同键盘输入语言的人的错误报告。当他们写带有重音符号的字母时,例如 ë 和 ê,它们分别显示为 ¨¨e 和 ^^e图书馆网站上也报告了此错误,但尚未解决。

为了尝试重现该错误,我在现有的“英语(美国)”旁边设置了另一种输入语言“荷兰语(比利时)”。经过一番玩弄后,我发现了以下内容:

当安装钩子的应用程序具有焦点并且语言设置为 'English (United States)' 时,不会发生该错误。在任何其他应用程序(例如记事本)中书写并使用“Dutch (Belgium)”来书写特殊字符工作。当安装钩子的应用程序具有焦点并且语言设置为“荷兰语(比利时)”时,确实会发生该错误。

我正在寻找有关两者如何相关的任何线索。也许我需要在键盘挂钩库中引入一些额外的检查?键盘挂钩的源代码可在线获得

4

1 回答 1

0

您的应用程序中似乎没有更新输入语言。查看您正在使用的库的源代码,他们似乎使用此调用来获取正确的键盘布局:

   internal static extern uint GetKeyboardLayout( int dwLayout );

但是,此方法的文档强调:

输入语言环境标识符是比键盘布局更广泛的概念,因为它还可以包含语音到文本转换器、输入法编辑器 (IME) 或任何其他形式的输入。由于键盘布局可以动态更改,缓存有关当前键盘布局信息的应用程序应处理 WM_INPUTLANGCHANGE 消息以获知输入语言的更改。

但是,基于对代码的快速浏览,库似乎没有响应此WM_INPUTLANGCHANGE消息,这可能会导致此行为

此外,这里是一个有用的链接,用于解释Windows 如何处理键盘

于 2013-08-22T21:12:08.253 回答