Регистрация горячих клавиш в .NET - комбинация из трех / четырех клавиш - PullRequest
1 голос
/ 20 января 2011

Я застрял.

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

    [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

редактировать: я узнал (как сказал Зуба), как "расшифровать", какая горячая клавиша была отправлена, и вот решение:

    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 ]

5 голосов
/ 20 января 2011

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

lParam Слово младшего разряда определяет клавиши, которые должны были быть нажаты в комбинации с клавишей, указанной старшим словом, для генерации сообщения 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 горячие клавиши поддерживают только один символ. Вам нужно будет подключить клавиатуру, чтобы обнаружить эту комбинацию из любого места (или обрабатывать сообщения, если вы хотите обнаруживать ее только тогда, когда ваше приложение активно).

0 голосов
/ 23 января 2011

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

...