2013-08-22 4 views
1

Я столкнулся с воспроизводимой ошибкой, которая для меня не имеет смысла. Надеюсь, кто-то знает больше о внутренних элементах ввода клавиатуры под Windows (я использую Windows 7) и могу указать мне в правильном направлении, как его решить. Теперь, когда он стоит, я не знаю, с чего начать.Как языковая панель (язык ввода) влияет на клавиатурные крючки?

Мое приложение создает глобальный крючок клавиатуры, используя библиотеку . Это работало отлично для меня, но я быстро получил сообщения об ошибках от людей, использующих разные языки ввода на клавиатуре. Когда они пишут буквы с акцентами, например. ë и ê, они отображаются как ¨¨e и ^^ e соответственно. This bug is also reported on the library's website, но еще не разрешен.

Чтобы попытаться воспроизвести ошибку, я установил альтернативный язык ввода «Голландский (Бельгия)» рядом с моим существующим «Английский (США)». После некоторого поворота я обнаружил следующее:

Ошибка не возникает, если приложение, устанавливающее крючок, имеет фокус, а язык установлен на «Английский (США)». Запись в любом другом приложении (например, блокнот) и использование «голландского (Бельгия)» для написания специальных символов. Ошибка возникает, когда приложение, которое устанавливает крючок, имеет фокус, а язык установлен на «голландский (Бельгия)».

Я ищу любую подсказку, как они связаны друг с другом. Возможно, мне нужно ввести некоторые дополнительные проверки в библиотеке клавишной клавиатуры? 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

 Смежные вопросы

  • Нет связанных вопросов^_^