是否有可能捕获(我认为app.xaml.cs中某处)任何键,如果按下打开的窗口?
感谢您的帮助!
答案 0 :(得分:6)
您可以使用类似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
}
}
答案 1 :(得分:4)
是和否。
焦点在处理给定键的顺序中起作用。捕获初始按键的控件可以选择不传递键,这将禁止您在最高级别捕获它。此外,.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详细说明,但要了解上述警告仍然存在。
答案 2 :(得分:1)
有一种更好的方法。在MS论坛上找到this。像魅力一样。
将此代码放入Application startup:
EventManager.RegisterClassHandler(typeof(Window),
Keyboard.KeyUpEvent,new KeyEventHandler(keyUp), true);
private void keyUp(object sender, KeyEventArgs e)
{
//Your code...
}