Я застрял.
Прямо сейчас, я использую следующий код для прослушивания горячих клавиш:
[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);
он работает отлично. мой вопрос в том, как зарегистрировать несколько горячих клавиш как одну и ту же комбинацию, например:
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 )