WPF обработка нажатия клавиш вне окна

210
17 декабря 2018, 14:50

Делаю приложение на WPF. Мне нужно, чтобы даже если окно не в фокусе, то оно все равно могло реагировать на нажатие клавиши Ctrl.

Answer 1

Вам нужно использовать глобальные системные хуки для перехвата нажатий клавиш.

В этой статье Henning Dieterichs создал для WPF класс для глобальных хуков, посмотрим как его использовать.

Копируем код основных классов из статьи. Далее (если нужна дополнительная логика) нам нужно унаследоваться от класса HotKey. У меня получилось следующее:

public class CustomHotKey : HotKey
{
    private Action<Key, ModifierKeys> _onHotKeyPressHandler;
    public CustomHotKey(Key key, ModifierKeys modifiers, Action<Key, ModifierKeys> onHotKeyPressAction = null)
        : base(key, modifiers, true)
    {
        _onHotKeyPressHandler = onHotKeyPressAction;
    }
    protected override void OnHotKeyPress()
    {
       _onHotKeyPressHandler?.Invoke(Key, Modifiers);
        base.OnHotKeyPress();
    }
}

Класс CustomHotKey принимает в конструкторе клавиши, нажатие которых нужно перехватить, а также делегат, который будет вызываться для обработки нажатия этих клавиш.

Далее на событие Loaded окна вешаем обработчик, в нем создаем экземпляр HotKeyHost и указываем какие клавиши или сочетания клавиш нам нужно отслеживать.

Если вам нужно отслеживать нажатие Ctrl, то первым параметром передаем Key.None, вторым - ModifierKeys.Control и третьим - метод, который будет обрабатывать нажатие клавиш. Для примера я также добавил код для сочетания Ctrl + A.

Вот что вышло:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    var hotKeyHost = new HotKeyHost((HwndSource) PresentationSource.FromVisual(this));
    hotKeyHost.AddHotKey(new CustomHotKey(Key.None, ModifierKeys.Control, OnHotkeyPress));
    hotKeyHost.AddHotKey(new CustomHotKey(Key.A, ModifierKeys.Control, OnHotkeyPress));
}

READ ALSO
Соединить списки

Соединить списки

Есть коллекция объектов A в каждом из объектов A есть коллекция объектов B и есть просто объект BКак с помощью LINQ получить коллекцию объектов...

194
Событие - Когда добавляется что либо в StackPanel

Событие - Когда добавляется что либо в StackPanel

Я прикрутил к StackPanel скролл, но он не так пока работает как мне хотелось быОн стоит на месте, когда содержимого больше чем высота StackPanel

134
Записать в log.txt о Mixed Content на странице?

Записать в log.txt о Mixed Content на странице?

Я использую ssl но иногда на страницах сайта встречаются внешнее изображения, добавлены пользователями, с протоколом http, как записать в logtxt...

201
Curl разный ответ сервера: 200 и 403

Curl разный ответ сервера: 200 и 403

Пытаюсь разобраться с Curl/ Запускаю следкод:

170