Как программно определить системную горячую клавишу? - PullRequest
3 голосов
/ 13 апреля 2009

Я ищу способ программно определять горячие клавиши в системе. Мое приложение поддерживает настраиваемые горячие клавиши для выполнения разных задач, и я хотел бы иметь возможность узнать, не застряло ли уже другое приложение или это встроенная горячая клавиша Windows (например, Win-L для блокировки рабочей станции).

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

Мне известны три способа использования горячих клавиш:

  • Системный хук, использующий стандартные API
  • Использование функции горячих клавиш в диалоге свойств для ярлыка
  • Опрос состояния асинхронного ключа и ответа

Я сомневаюсь, что могу обнаружить третий тип, но как насчет двух других? И есть ли еще какие-то ситуации, о которых мне нужно знать?

1 Ответ

4 голосов
/ 13 апреля 2009

Я могу придумать три способа сделать это с помощью стандартного API:

  • RegisterHotkey

  • SetWindowsHookEx (WH_KEYBOARD)

  • SetWindowsHookEx (WH_LL_KEYBOARD)

При первом подходе вы получите в возвращаемом значении, было ли другое приложение уже зарегистрировало ту же самую горячую клавишу (или это сочетание клавиш используется горячей клавишей, или Explorer.exe зарегистрировало горячую клавишу, потому что это Win + E или win + R) ). Вы не можете получить название приложения таким образом.

Использование Windows Hooks или состояний асинхронных клавиш для «горячих клавиш»: я не думаю, что там можно обнаружить горячие клавиши, поскольку вы можете использовать горячие клавиши в контексте (например, заменить «t» на «irst», если последние четыре нажатия клавиш были "фрис") именно так. Вы можете ввести горячую клавишу, используя keybd_event (со сфокусированным окном), и проверить, проходит ли событие; с другой стороны, некоторые случаи «горячих клавиш», которые реализуются через ловушки, не используют нажатие клавиши, поэтому оно все равно будет проходить.

Подход, который я бы использовал: сначала убедитесь, что для ввода ярлыка вам необходимо ввести именно этот ярлык в поле ярлыка (в случае неудачи пользователь увидит, какое приложение его использует). Затем используйте RegisterHotkey, чтобы вы заметили (в будущих сеансах), что другое «хорошо себя зарекомендовавшее себя» приложение попыталось украсть этот ярлык у вас.

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