Как отловить нажатие клавиш в WPF-приложении, когда оно свёрнуто?

254
30 декабря 2017, 01:37

Имеется WPF-приложение (аудио-проигрыватель). Необходимо добавить возможность отлавливать нажатие определённых клавиш, даже когда приложение свёрнуто. Например, при нажатии Num4 - останавливать вопроизведение, при нажатии других клавиш (в зависимости от настроек - продолжать воспроизведение музыки и т.п.). Пробовал реализовать через функцию GetAsyncKeyState(int vkey) из user32.dll, но мне это не совсем подходит, вот пример кода:

public static class KeyState
{
    public static void Wait(Key key, Action<KeyStates> action)
    {
        var asyncOperation = AsyncOperationManager.CreateOperation(null);
        SendOrPostCallback callBack = state => action((KeyStates) state);
        ThreadPool.QueueUserWorkItem(state =>
        {
            var vk = KeyInterop.VirtualKeyFromKey(key);                
            var prev = ((GetAsyncKeyState(vk) & 0x8000) == 0x8000);
            if (prev)
            {
                asyncOperation.Post(callBack, KeyStates.Down);
            }
            while (true)
            {
                var res = ((GetAsyncKeyState(vk) & 0x8000) == 0x8000);
                if (res != prev && res)
                {
                    asyncOperation.Post(callBack, KeyStates.Down);
                }
                prev = res;
            }
        });
    }
    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
    private static extern short GetAsyncKeyState(int vkey);
}

Проблема здесь в том, что мне не только нужно отловить нажатие клавиши, но и предотвратить "продвижение" нажатия клавиши далее. Т.е. нажатие клавиши должно перехватываться моим приложением и не попадать в другие (например, в текстовый редактор). Буду благодарен за помощь. Если кто-нибудь ещё и подскажет как это корректно реализовать для приложения, которое развертывается через ClickOnce, было бы вообще шикарно. Спасибо!

READ ALSO
Разбор регулярного выражения

Разбор регулярного выражения

Есть необходимость достраивать строку до "полного вида"Думал сделать это через регулярное выражение

261
Как программно изменить title другого окна? И как программно менять xaml элементы?

Как программно изменить title другого окна? И как программно менять xaml элементы?

Как программно изменить title другого xaml окна? Из xaml страницы? Пробовал так - MainMenuTitle = "new title";(MainMenu объявил), но выбивает ошибку -

214
Парсер json с декодированием текста

Парсер json с декодированием текста

В Json встречаются такие тексты \u0432\u043b\u0435, есть ли какой нибудь online парсер Json, который бы декодировал такой текст ?

240