Поймать комбинацию клавиш во всех окнах в WPF без добавления события в каждом окне - PullRequest
2 голосов
/ 29 января 2011

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

Если комбинация клавиш совпадает. Я хочу открыть окно в текущем окне, которое выполняется.

Как я могу это сделать.

Редактировать

Я хочу добавить событие KeyPress для класса Application, чтобы оно могло захватывать нажатие клавиш во всех окнах. Один из способов сделать это - я могу зайти в каждое окно и добавить событие в каждое окно. Но что, если количество окон достаточно велико? это мой сценарий.

Итак, я пытался сделать что-то в классе Application, чтобы выполнить ту же работу.

Как я могу сделать

Ответы [ 3 ]

1 голос
/ 29 января 2011

Используйте событие PreviewKeyDown.Он отправляется каждым элементом управления до того, как они обработают ключ самостоятельно.

В качестве альтернативы вы можете использовать CommandBindings .

0 голосов
/ 29 января 2011

Может быть, вы можете попробовать использовать низкоуровневый Windows API хуков из C # примерно так: http://www.codeproject.com/KB/system/CSLLKeyboard.aspx

это будет включать в себя код с использованием System.Runtime.InteropServices и user32.dll

...

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
// and the code to create the event handler, etc... See more on the referred article.
...
0 голосов
/ 29 января 2011

Как простое и простое решение, возможно, вы могли бы использовать что-то вроде этого: вместо того, чтобы вручную добавлять событие в каждое окно, вы заставляете компьютер делать это за вас.

    private void AssignEventHandlers()
    {
        foreach (Window window in Application.Current.Windows)
        {
            //if (window != Application.Current.MainWindow)
                window.KeyDown += new System.Windows.Input.KeyEventHandler(window_KeyDown);
        }
    }

    void window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
    {
        // MessageBox.Show(e.Key.ToString());
        if (System.Windows.Input.Keyboard.Modifiers == (System.Windows.Input.ModifierKeys.Control | System.Windows.Input.ModifierKeys.Alt)
            && e.Key == System.Windows.Input.Key.O)
        {
            MessageBox.Show(System.Windows.Input.Keyboard.Modifiers.ToString() + " " + e.Key.ToString());
        }
    }

Источники:

http://www.eggheadcafe.com/sample-code/SilverlightWPFandXAML/aeac920b-a64f-43b3-976b-2f7c91a5212b/wpf-get-all-windows-in-an-application.aspx

http://www.codegain.com/articles/wpf/miscellaneous/how-to-detect-ctrl-alt-key-combinations-in-wpf.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...