8

Is it possible, to capture (somewhere in app.xaml.cs i guess) any key and if it pressed open window?

Thanks for help!

4

3 回答 3

8

有个更好的方法。在 MS 论坛上找到了这个。奇迹般有效。

将此代码放在应用程序启动中:

EventManager.RegisterClassHandler(typeof(Window),
     Keyboard.KeyUpEvent,new KeyEventHandler(keyUp), true);

private void keyUp(object sender, KeyEventArgs e)
{
      //Your code...
}
于 2017-02-27T11:43:00.147 回答
4

你可以使用类似这个 gist的东西来注册一个全局钩子。只要在您的应用程序运行时按下给定的键,它就会触发。你可以App像这样在你的课堂上使用它:

public partial class App
{
    private HotKey _hotKey;

    protected override void OnActivated(EventArgs e)
    {
        base.OnActivated(e);
        RegisterHotKeys();
    }

    protected override void OnExit(ExitEventArgs e)
    {
        base.OnExit(e);
        UnregisterHotKeys();
    }

    private void RegisterHotKeys()
    {
        if (_hotKey != null) return;

        _hotKey = new HotKey(ModifierKeys.Control | ModifierKeys.Shift, Key.V, Current.MainWindow);
        _hotKey.HotKeyPressed += OnHotKeyPressed;
    }

    private void UnregisterHotKeys()
    {
        if (_hotKey == null) return;

        _hotKey.HotKeyPressed -= OnHotKeyPressed;
        _hotKey.Dispose();
    }

    private void OnHotKeyPressed(HotKey hotKey)
    {
        // Do whatever you want to do here
    }
}
于 2012-12-19T18:28:22.137 回答
3

是和不是。

焦点在处理给定键的顺序中起作用。捕获初始按键的控件可以选择不传递键,这将禁止您在最顶层捕获它。此外,.NET 框架中有一些控件可以在某些情况下吞下某些键,但是我无法回忆起特定的实例。

如果您的应用程序很小并且深度只不过是一个带有按钮的窗口,那么这当然是可以实现的,并且将遵循在 WPF 应用程序中捕获击键的标准方法。

protected override void OnKeyDown(KeyEventArgs e)
{
    if (e.Key == Key.LeftCtrl || e.Key == Key.RightCtrl)
          myVariable = true;
    if (ctrl && e.Key == Key.S)
          base.OnKeyDown(e);
}

protected override void OnKeyUp(KeyEventArgs e)
{
    if (e.Key == Key.LeftCtrl || e.Key == Key.RightCtrl)
          myVariable = false;

    base.OnKeyUp(e);
}

如果您的应用程序很大,您可以尝试此处详述的全局挂钩,但要了解上述警告仍然存在。

于 2012-12-19T18:20:32.780 回答