Глобальное нажатие клавиши 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)