GetMessage(WM_CHAR) переопределить? Убедившись, что все остальные Window Hooks активированы

Я ищу способ перехватить вызов GetMessage() для WM_CHAR во внешнем процессе (точнее, только в активном окне). Я не решаюсь использовать SetWindowsHookEx() — я хочу быть абсолютно уверенным, что самый широкий спектр программ, которые могут изменять ввод с клавиатуры, сработает первым. У кого-нибудь есть предложения?

Контекст: я создаю приложение, предназначенное для создания изображения текущей раскладки клавиатуры. Тем не менее, я стремлюсь сделать его максимально совместимым со сторонним программным обеспечением для переназначения клавиатуры (включая пользовательские сценарии AutoHotkey и тому подобное). При запуске с помощью горячей клавиши моя программа отправляет нажатия клавиш в активное окно (скан-коды + соответствующие виртуальные клавиши), которые должны быть обработаны ее оконной процедурой... был запрограммирован только на переназначение клавиш в активном приложении... и тогда моя программа перехватит результирующее сообщение WM_CHAR / WM_UNICHAR / WM_DEADCHAR, из которого она реконструирует раскладку клавиатуры. По сути, символьные сообщения никогда не должны попадать в активное окно для вывода. (Я мог бы заменить их сообщениями без символов для совместимости.)

P.S. Извините, наверное, это ужасный этикет - задавать вопрос первым делом после регистрации - но я исследовал этот вопрос уже много ночей и до сих пор не нашел оптимального решения! Я работаю в основном с AutoHotkey, и я полностью готов поделиться другими методами, которые я рассматривал для получения истинной текущей раскладки клавиатуры, но все они имеют свои ограничения в отношении: хорошая игра с программным обеспечением для переназначения.


person Illya Moskvin    schedule 02.01.2013    source источник
comment
Я думаю, что ищу решение, похожее на Microsoft Detours. В настоящее время я экспериментирую с облегченным DetourXS v2, используя внедрение DLL и концепции IPC. , но у меня нет реального опыта в C++, поэтому продвигаюсь медленно. Я обновлю снова, как только у меня будет что-то конкретное! Приветствуются любые предложения по обходу циклов сообщений!   -  person Illya Moskvin    schedule 07.01.2013


Ответы (1)


Поставьте «~» (без кавычек) перед горячей клавишей.

Это запустит любой код, который у вас есть для горячей клавиши и позволит пропустить нажатие клавиши.

Пример:

~^a::
MsgBox, You pressed Ctrl+a
return
person Michael    schedule 20.12.2013