Зарегистрировать горячие клавиши в .NET – комбинация из трех / четырех клавиш

Я застрял.

Прямо сейчас, я использую следующий код для прослушивания горячих клавиш:

[DllImport("user32.dll")] public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vlc); [DllImport("user32.dll")] public static extern bool UnregisterHotKey(IntPtr hWnd, int id); protected override void WndProc(ref Message m) { if (m.Msg == 0x0312) { // whatever i need } base.WndProc(ref m); } 

и эта функция для регистрации горячей клавиши:

 Form1.RegisterHotKey(this.Handle, this.GetType().GetHashCode(), 0, (int)chr); 

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

  1. А + В + С + D,
  2. ALT + SHIFT + B
  3. CTRL + ALT + SHIFT + X

edit: Я узнал (как сказал Zooba), как «расшифровать», какую горячую клавишу отправить, и вот решение:

  protected override void WndProc(ref Message m) { if (m.Msg == 0x0312) { Keys key = (Keys)(((int)m.LParam >> 16) & 0xFFFF); ModifierKeys modifier = (ModifierKeys)((int)m.LParam & 0xFFFF); if ((modifier + "+" + key == "Alt+S")) { //do what ever I need. } } base.WndProc(ref m); } 

Из документации для WM_HOTKEY :

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

Таким образом, вы можете прочитать член LParam m для определения нажатых клавиш (в качестве альтернативы, если вы назначаете более разумные идентификаторы, чем GetHashCode вы можете проверить WParam ).

«Слово высокого порядка» и « LParam слово» относятся к частям целого числа (фактически IntPtr ), содержащегося в LParam , поэтому вам нужно будет извлечь их. Слово i & 0xFFFF порядка – i & 0xFFFF , а слово высокого порядка (i >> 16) & 0xFFFF .

Чтобы определить, какая комбинация клавиш была нажата, проверьте самые низкие четыре бита младшего слова для модификаторов (shift, alt, control) и сравните слово высокого порядка с кодом виртуального ключа, которое для букв равно символу значение капитала (например, код виртуального ключа для A есть (int) ‘A’, но не (int) ‘a’).

Ваша комбинация «A + B + C + D» недействительна, так WM_HOTKEY горячие клавиши WM_HOTKEY поддерживают только один символ. Вам нужно будет прикрепить клавиатурный крючок, чтобы обнаружить эту комбинацию из любого места (или обрабатывать сообщения, если вы хотите их обнаружить, пока приложение активно).

Я нашел ответ. Вместо использования registerhotkey я использовал KeyState и он решил все мои проблемы. Если кому-то интересно, вы можете пойти здесь ( резервное копирование на archive.org )