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

StackOverflow https://stackoverflow.com/questions/4752204

Вопрос

Я застрял.

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

    [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. A+B+C+D
  2. ALT+SHIFT+B
  3. CTRL+ ALT+ SHIFT+ X

Редактировать:Я узнал (как и сказал 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);
    }
Это было полезно?

Решение 2

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

Другие советы

Из документации для WM_ХОТ-КЛЮЧ:

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top