2012-03-09 4 views
0

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

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

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

Просто когда falg является SET или 1 ключ, и когда она UNSET или 0 ключ вверх.

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

Я могу сделать этот трюк работой.

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

+3

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

ответ

4

Да, это лучший вариант - RegisterHotKey function.

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

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

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

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

const int WM_HOTKEY = 0x0312; 

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

Смежные вопросы