Регистрация горячих клавиш в.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

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

Другие вопросы по тегам