Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在整个应用程序中捕获按键_C#_Wpf_Keypress - Fatal编程技术网

C# 在整个应用程序中捕获按键

C# 在整个应用程序中捕获按键,c#,wpf,keypress,C#,Wpf,Keypress,是否有可能捕获(我猜是在app.xaml.cs中的某个地方)任何键,以及它是否按下了open window 谢谢你的帮助 是和否 焦点在处理给定键的顺序中起作用。捕获初始按键的控件可以选择不传递按键,这将禁止您在最顶层捕获按键。此外,.NET framework中还有一些控件在某些场景下吞下某些键,但是我无法调用特定实例 如果您的应用程序很小,并且深度只不过是一个带有按钮的窗口,那么这当然是可以实现的,并且将遵循在WPF应用程序中捕获关键笔划的标准方法 protected override vo

是否有可能捕获(我猜是在app.xaml.cs中的某个地方)任何键,以及它是否按下了open window

谢谢你的帮助

是和否

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

如果您的应用程序很小,并且深度只不过是一个带有按钮的窗口,那么这当然是可以实现的,并且将遵循在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);
}

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

您可以使用类似于注册全局挂钩的方法。当应用程序运行时,只要按下给定的键,它就会触发。您可以在
应用程序中使用它,如下所示:

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
    }
}

有更好的办法。在MS论坛上找到。工作起来很有魅力

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

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

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

如果(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。在low level中,应该可以在顶级表单中重写该方法,该表单将接收所有消息并处理您的按键。示例和我尝试使用此示例,但调试时出错:App.OnStartup(object,System.Windows.StartupEventArgs)':找不到合适的方法覆盖选中修改后的答案感谢快速响应。不幸的是,我不知道为什么,但这对我不起作用。我把所有的代码(包括link中的类)都放进去了,但从来没有进入“keyPress”Ok-works。但是正如我在第一篇文章中所说,我有很多窗户。实际上,它只在first(loginWindow)上工作。有没有可能,在所有窗口中都使用它,而不在其中添加方法?好的,我想我明白了。我在我的登录窗口中使用RegisterHotKeys作为方法。当用户丢失时,我正在创建这个类的对象,感谢我在每个窗口中访问它。非常感谢您的帮助!:)