Глобальный низкоуровневый клавишный крючок для комбинаций - PullRequest
0 голосов
/ 09 марта 2012

я знаю, как это сделать «Глобальный низкоуровневый крючок клавиатуры» благодаря этому учебнику.

Я также хотел отслеживать комбинации клавиш или ярлыков,

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

Просто, когда Falg равен SET или 1 , клавиша нажата, а когда UNSET или 0 , клавиша нажата.

Я могу использовать это для сочетания клавиш \ горячих клавиш. Когда нажата одна клавиша, ловушка приведет меня к функции, в которой я буду обрабатывать событие. Что я хочу сделать, это проверить, установлен ли какой-либо другой конкретный флаг. Если да, то это означает, что одновременно нажимаются две клавиши, и поэтому у меня есть комбинация.

Я могу заставить этот трюк работать.

То, что я ищу, является лучшим вариантом. Есть ли.

1 Ответ

4 голосов
/ 09 марта 2012

Да, этот лучший вариант - функция RegisterHotKey .

Глобальные хуки - очень сложный подход и должны использоваться только там, где это абсолютно необходимо. В этом случае звучит так, будто не только глобальный хук не нужен, но на самом деле его сложнее реализовать, чем отвечать на простое WM_HOTKEY сообщение , автоматически генерируемое при каждом нажатии желаемой последовательности клавиш.

Поскольку вы используете .NET, вам потребуется P / Invoke для функции RegisterHotKey.
Определение выглядит примерно так:

[DllImport("user32.dll", SetLastError = true)]
static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);

Сообщение WM_HOTKEY, которое вы можете обработать, переопределив WndProc метод вашей формы (тот, чей дескриптор вы указали при вызове функции RegisterHotKey, соответствует следующему значению:

const int WM_HOTKEY = 0x0312;

Все остальные необходимые значения четко указаны в связанной документации для функции RegisterHotKey. Документы, конечно, требуют чтения; в противном случае вы пропустите важные предупреждения.

...