Необработанный ввод Win32 блокирует переключение языкового стандарта ввода, если указан RIDEV_NOLEGACY - PullRequest
0 голосов
/ 15 января 2019

Я пишу систему ввода с клавиатуры для Windows на основе Raw Input . Он реализован с установленным флагом RIDEV_NOLEGACY, и устаревшие сообщения клавиатуры генерируются вручную, только когда ввод не был обработан клиентами.

Мне удалось заставить его работать, но горячая клавиша переключения языков (Alt + Shift в моем случае) теперь не работает.

Система должна:

  1. различают разные устройства ввода;

  2. обнаружение подключения устройства [dis];

  3. позволяет обработчикам потреблять ввод, предотвращая его обработку обработчиками с наименьшим приоритетом;

  4. сохранить альтернативные коды функциональные;

  5. если возможно, оставьте ускорители с функциональными системными клавишами тоже;

Я пробовал много комбинаций необработанных настроек ввода, но каждая нарушает некоторые требования. Основная проблема сейчас с 3.

С помощью обработчика RIDEV_NOLEGACY можно использовать WM_INPUT или оставить его необработанным. Во втором случае система сама генерирует сообщения WM_ [SYS] KEYUP / WM_ [SYS] KEYDOWN и отправляет их через PostMessage. Поскольку PostMessage не обновляет состояние клавиатуры потока, система также обновляет его в соответствующем месте. Итак, 3, 4 и 5 в порядке. Но Alt + Shift перестает отвечать.

Без RIDEV_NOLEGACY Alt + Shift изменяет локаль, как и ожидалось, но необработанный ввод генерирует устаревший WM_ [SYS] KEYUP / WM_ [SYS] KEYDOWN независимо от того, обрабатывал ли какой-либо клиент WM_INPUT или нет.

Существует минимальный рабочий пример проблемы: https://github.com/niello/misc/tree/master/RawInputLocale

Воспроизводится на Win10 и Win8.1, но, вероятно, будет одинаковым в любой Windows начиная с Vista.

Обратите внимание, что если вы установите USE_NOLEGACY_RAW_INPUT в примере на true , сообщения WM_CHAR генерируются только для каждого второго нажатия клавиши, как если бы другое использовалось нашим системным клиентом, но если вы пытаетесь изменить язык ввода , Ничего не произошло. И если вы установите для USE_NOLEGACY_RAW_INPUT значение false , вы будете переключать локаль в обычном режиме и получать WM_INPUTLANGCHANGE, но WM_CHAR будет также генерироваться для использованных нажатий клавиш.

У меня закончились идеи, поэтому любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 15 января 2019

После другого дня, кажется, нет простого решения. RIDEV_NOLEGACY просто убивает переключение языка с помощью горячей клавиши. Хорошей новостью является то, что вся необходимая логика может быть реализована вручную. Это мое решение на данный момент. Он учитывает настройку горячих клавиш системы, подавляет генерацию символов для клавиши `` ', когда она используется в качестве горячих клавиш, и даже обнаруживает изменения горячих клавиш системы без перезапуска приложения. Код доступен в том же репо . Надеюсь, это поможет кому-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...