【问题标题】:How does the language bar (input language) impact keyboard hooks?语言栏(输入语言)如何影响键盘挂钩?
【发布时间】:2013-08-25 05:01:31
【问题描述】:

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

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

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

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

我正在寻找有关两者之间关系的任何线索。也许我需要在键盘挂钩库中引入一些额外的检查? source code of the keyboard hook is available on line

【问题讨论】:

    标签: windows winapi keyboard input-language


    【解决方案1】:

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

       internal static extern uint GetKeyboardLayout( int dwLayout );
    

    这个方法的documentation不过强调:

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

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

    另外,这里有一个有用的链接,指向an explanation Windows 如何处理键盘

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      相关资源
      最近更新 更多