我遇到了一个可复制的错误,这个错误对我来说真的没有意义。希望有人能更多地了解Windows(我使用的是Windows7)下键盘输入的内部原理,并能为我指明解决它的正确方向。就目前情况来看,我真的不知道该从哪里开始。
我的应用程序使用MouseKeyboardActivityMonitor库创建了一个全局键盘挂钩。这对我来说很好,但我很快就收到了来自使用不同键盘输入语言的人的错误报告。当他们写带有重音的字母时,例如ë和ê,它们分别显示为¨¨e和^^e。图书馆的网站上也报道了这个错误,但尚未解决。
为了重现这个错误,我在现有的"英语(美国)"旁边设置了一个替代输入语言"荷兰语(比利时)"。经过一番折腾,我发现了以下内容:
当安装挂钩的应用程序有焦点,并且语言设置为"English(United States)"时,该错误不会发生。在任何其他应用程序(如记事本)中书写,并使用"荷兰语(比利时)"书写特殊字符。当安装挂钩的应用程序有焦点,并且语言设置为"荷兰语(比利时)"时,就会出现错误。
我正在寻找这两者之间如何联系的线索。也许我需要在键盘挂钩库中引入一些额外的检查?键盘挂钩的源代码在线提供。
您的应用程序中似乎没有更新输入语言。看看你正在使用的库的源代码,他们似乎使用这个调用来获得正确的键盘布局:
internal static extern uint GetKeyboardLayout( int dwLayout );
然而,该方法的文档强调:
输入语言环境标识符是一个比键盘更广泛的概念布局,因为它还可以包含语音到文本转换器输入法编辑器(IME)或任何其他形式的输入。自键盘布局可以动态更改,缓存的应用程序有关当前键盘布局的信息应处理WM_INPUTLANGCHANGE消息将被告知输入中的更改语言
然而,根据对代码的快速浏览,库似乎没有响应此WM_INPUTLANGCHANGE
消息,这可能导致出现这种行为
此外,这里还有一个有用的链接,可以解释Windows 如何处理键盘