Я пишу приложение для Win32, которое должно использовать горячие клавиши, не находясь в фокусе (оно работает в фоновом режиме без рисования окна). Я использую RegisterHotKey для предоставления нескольких ключей, но это блокирует любой другой процесс. Например, я назначаю клавишу «c», и когда я нажимаю ее в блокноте, ничего не происходит.
RegisterHotKey()
регистрирует глобальные горячие клавиши. Горячие клавиши обрабатываются до обычной обработки ввода с клавиатуры. Это означает, что если вы успешно зарегистрируете горячую клавишу, нажатие этой клавиши приведет к тому, что вы получите сообщение горячей клавиши, а не приложение с фокусом, получающим нормальное WM_KEYDOWN
/WM_CHAR
Сообщения. Вы фактически заблокировали другие приложения от просмотра нажатия этой клавиши.
Это по замыслу.
Очевидно, что решение, позволяющее избежать столкновений, описанных вами, не Зарегистрируйте горячую клавишу, которую могут использовать другие приложения. Если вы зарегистрируете C без квалификаторов в качестве горячей клавиши, то никакая другая программа не увидит нажатие клавиши C. Вместо этого вы должны использовать квалификаторы, такие как Ctrl / Shift / Alt, чтобы ваша горячая клавиша не мешала нормальному использованию клавиатуры.
Нет способа зарегистрировать горячую клавишу, которая является глобальной если активна другая программа Если вы хотите достичь ситуации, когда, скажем, ваша горячая клавиша работает, когда рабочий стол активен, но больше ничего нет, вы можете использовать ловушку сообщений, чтобы ввести код в процесс рабочего стола (через SetWindowsHookEx()
) и перехватить нажатие клавиш таким образом. Но вы не можете сделать это с RegisterHotKey()
,
GetAsyncKeyState()
может использоваться для определения, нажимаются ли определенные клавиши, даже когда программа работает в фоновом режиме.