Ловля "глобальных горячих клавиш" (Windows) - PullRequest
0 голосов
/ 10 марта 2011

Сейчас я пытался создать такую ​​же функциональность, как в приложениях голосового чата Push-To-Talk, но до сих пор не смог найти подходящих решений для этого.Я не использую MFC или CLR.

Проблема довольно проста.Мое окно должно быть не в фокусе (т.е. свернуто и т. Д.), Но мне нужно реагировать на нажатия клавиш (в основном, я даже не хочу знать, удерживается ли кнопка нажатой или нет).К сожалению, WM_KEYDOWN работает, только если окно имеет фокус клавиатуры.Я знаю, что, например, Teamspeak использует DirectInput для этого, но я также знаю, что это определенно можно сделать и без него, что я бы очень предпочел.

Единственное другое решение, которое я мог бы сделатьРабота опрашивается с GetAsyncKeyState, но, похоже, это тоже далеко не хорошее решение.Если это вообще возможно, я бы все же предпочел использовать сообщения Windows.

Ответы [ 2 ]

2 голосов
/ 10 марта 2011

Проблема может быть решена либо с помощью RegisterHotKey, либо с помощью глобальной низкоуровневой клавиатуры .

RegisterHotKey (который Коди Грей предложил в комментариях), вероятно, является более подходящим выбором здесь.

0 голосов
/ 10 апреля 2017

Я согласен с Джоном.Используйте user32.dll и функцию RegisterHotKey.Очень полезный пример кода находится по адресу: https://www.codeproject.com/kb/cs/kiosk_cs.aspx?display=print

Если, как я изначально и представлял, код выглядит как полный бред, и вы не знаете, что делать, посмотрите учебные пособия: https://www.youtube.com/watch?v=qQWqGOaZiFI Они очень полезны!

Если вы попытаетесь зарегистрировать системную горячую клавишу: Однако обратите внимание, что код из первой ссылки вернет ошибку, в зависимости отна какую системную горячую клавишу вы пытаетесь зарегистрироваться.Мой вопрос по этому вопросу, который выдвигает на первый план проблему: Как отключить системные горячие клавиши в user32.dll? (в настоящее время не решен).Там также есть редактирование кода, которое исправит одну из ошибок, которые вы получите, если попытаетесь переопределить системные клавиши :

[DllImport("user32.dll", SetLastError = true)]

Мне удалось заблокировать Горячая клавиша Windows + E , но другие, такие как Alt + F4 и Home + Right , не отключаются и возвращают ошибку.

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

Marshal.GetLastWin32Error()

^ Полный контекст этой строки кода находится в первой ссылке!

...