Глобальное нажатие клавиши Windows

У меня есть простое приложение WPF, и мне нужно захватить клавишу F1, нажатую в Windows (Operation System), даже если мое окно WPF сведено к минимуму или оно не активировано.

У меня проблемы с обнаружением этого. Я искал в Интернете, и я нашел много результатов, но они мне не помогли.

Для обнаружения клавиши, нажатой внутри приложения, я использовал этот простой код:

AddHandler(Keyboard.KeyDownEvent, (KeyEventHandler)KeyPressed);
private void KeyPressed(object sender, KeyEventArgs e)
{
      if (e.Key == Key.F1)
      {
           //my code went here
      }
}

Но это не работает, когда мое окно не активировано.

Итак, мой вопрос: как обнаружить глобальное нажатие клавиши?

Повторяю: это приложение WPF.

Ответы

Ответ 1

Не нужно Keyboard Hooking. Просто используйте RegisterHotKey (определяет горячую клавишу для всей системы) и UnregisterHotKey из Windows API. Попробуйте использовать их в С# из pinvoke.net или этих учебных пособий:

В Форумы Microsoft.

Вы можете использовать эти модификаторы и коды виртуальных ключей:

MOD_ALT      (0x0001)
MOD_CONTROL  (0x0002)
MOD_NOREPEAT (0x4000)
MOD_SHIFT    (0x0004)
MOD_WIN      (0x0008)

например, клавиша F1 VK_F1 (0x70).

Ответ 2

Когда ваше приложение не в фокусе - насос messags ничего не получит - вам нужно использовать API уровня системы для подключения ключей. (попытайтесь найти информацию о SetWindowsHookEx)