2013-08-22 78 views
1

我遇到了一个可重现的错误,这对我来说并没有什么意义。希望有人对Windows下键盘输入的内部知识有更多的了解(我正在使用Windows 7),并可以指导我如何解决它的正确方向。现在,我不知道我应该开始看什么。语言栏(输入语言)如何影响键盘挂钩?

我的应用程序使用库创建一个全局键盘钩子。这对我来说工作得很好,但我很快收到使用不同键盘输入语言的人的错误报告。当他们写有重音的字母时,例如ë和ê,它们分别显示为“和^^ e分别为This bug is also reported on the library's website,但尚未解决。

为了重现错误,我在现有的“英语(美国)”旁边设置了替代输入语言'Dutch(比利时)'。经过一番周折之后,我发现了以下内容:

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

我在寻找任何线索作为两者如何相关。也许我需要在键盘钩子库中引入一些额外的检查? source code of the keyboard hook is available on line

回答

0

看来输入语言没有在您的应用程序中更新。看着您正在使用该库的源代码,似乎他们使用这个调用来得到正确的键盘布局:

internal static extern uint GetKeyboardLayout(int dwLayout); 

的。但是这种方法强调documentation

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

然而,基于在代码快速浏览,库似乎并没有回应此事WM_INPUTLANGCHANGE消息,这可能会导致这种行为

而且,这里是an explanation如何键盘的有用链接由Windows处理