【问题标题】:Capture key press in whole application在整个应用程序中捕获按键
【发布时间】:2012-12-07 03:28:52
【问题描述】:

是否有可能捕获(我猜是在 app.xaml.cs 中的某个位置)任何键以及它是否按下了打开的窗口?

感谢您的帮助!

【问题讨论】:

  • 类似于if (ky.Key == Key.Up || ky.Key == Key.Down || ky.Key == Key.Right || ky.Key == Key.Left || ky.Key == Key.Add || ky.Key == Key.Subtract || ky.Key == Key.PageUp || ky.Key == Key.PageDown) 的东西?请提供更多信息!
  • 在 web/stackoverflow 中搜索 ProcessCmdKey,在 WndProc 中搜索 WPF。在低级别,应该可以以顶级形式覆盖此类方法,该方法将接收所有消息并处理您的按键。例子1234

标签: c# wpf keypress


【解决方案1】:

有更好的方法。在 MS 论坛上找到 this。像魅力一样工作。

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

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

private void keyUp(object sender, KeyEventArgs e)
{
      //Your code...
}

【讨论】:

  • Winforms 有类似的东西吗?
【解决方案2】:

你可以使用this 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
    }
}

【讨论】:

  • 我尝试使用此示例,但在调试时出错:App.OnStartup(object, System.Windows.StartupEventArgs)':找不到合适的方法来覆盖
  • 查看修改后的答案
  • 感谢您的快速响应。不幸的是 - 不知道为什么,但对我不起作用。我把所有的代码(包括来自链接的类),但从来没有进入“keyPress”
  • 好的 - 现在可以使用了。但是.. 正如我在第一篇文章中所说,我有很多窗户。实际上它仅适用于第一个(loginWindow)。是否有可能以某种方式在所有窗口中使用它而不将方法放入其中?
  • 好的,我想我明白了。我在我的登录窗口中使用 RegisterHotKeys 作为方法。当用户被浏览时,我正在创建此类的对象,感谢每个窗口中我可以访问的内容。非常感谢您的帮助! :)
【解决方案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);
}

如果您的应用程序很大,您可以尝试global hook,详见此处,但请理解上述警告仍然存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 2014-04-23
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多