Я пишу систему ввода с клавиатуры для Windows на основе Raw Input . Он реализован с установленным флагом RIDEV_NOLEGACY, и устаревшие сообщения клавиатуры генерируются вручную, только когда ввод не был обработан клиентами.
Мне удалось заставить его работать, но горячая клавиша переключения языков (Alt + Shift в моем случае) теперь не работает.
Система должна:
различают разные устройства ввода;
обнаружение подключения устройства [dis];
позволяет обработчикам потреблять ввод, предотвращая его обработку обработчиками с наименьшим приоритетом;
сохранить альтернативные коды функциональные;
если возможно, оставьте ускорители с функциональными системными клавишами тоже;
Я пробовал много комбинаций необработанных настроек ввода, но каждая нарушает некоторые требования. Основная проблема сейчас с 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 будет также генерироваться для использованных нажатий клавиш.
У меня закончились идеи, поэтому любая помощь будет принята с благодарностью.