【问题标题】:Custom handling WinKey+ArrowKey combination自定义处理 WinKey+ArrowKey 组合
【发布时间】:2017-11-14 00:33:22
【问题描述】:

是否有可能在 Windows 处理 WPFWindow 之前处理 WinKey+ArrowKey 组合键?使用OnPreviewKeyDown(KeyEventArgs e),我可以捕捉到分别按下 WinKey 和 ArrowKey 时,但不是 WinKey+ArrowKey 组合。似乎它是由系统处理的,窗口只获取调整大小的命令。有没有办法在系统之前处理这种组合?

【问题讨论】:

  • 您可能可以使用 RegisterHotKey() 窃取它们,但即使您的应用程序不在前台,这也会使它们处于活动状态。 “不要这样做”是唯一的好建议。
  • @HansPassant 我怎样才能为 WPF 窗口处理 WM_HOTKEY?
  • 在搜索框中输入“[wpf] registerhotkey”。 58 次点击,很怀疑你还需要一个。

标签: c# .net wpf


【解决方案1】:

为此,您需要使用全局键盘挂钩。这里有一个很好的项目可以让你朝着正确的方向开始:https://www.codeproject.com/Articles/19004/A-Simple-C-Global-Low-Level-Keyboard-Hook

重申 Hans Passant 的警告,即使您的程序在后台运行,这也会捕获组合键。如果这不是您想要的,那么您将需要在您的程序获得焦点/未获得焦点时订阅和取消订阅事件,或者在其中添加额外的逻辑以在采取任何操作之前检测您的程序是否是焦点程序。

如果您从链接中导入类,那么您可以像这样在代码中实现它们(编辑:这似乎适用于 KeyValue,但不适用于 KeyCode):

GlobalKeyboardHook gkh = new GlobalKeyboardHook();
private bool _winKeyPressed;

public MyConstructor()
{
    gkh.HookedKeys.Add(Keys.Left); //37
    gkh.HookedKeys.Add(Keys.Up); //38
    gkh.HookedKeys.Add(Keys.Right); //39
    gkh.HookedKeys.Add(Keys.Down); //40

    gkh.HookedKeys.Add(Keys.LWin); //91
    gkh.HookedKeys.Add(Keys.RWin); //92

    gkh.KeyDown += gkh_KeyDown;
    gkh.KeyUp += gkh_KeyUp;
}

private void gkh_KeyUp(object sender, KeyEventArgs e)
{ 
    if (e.KeyValue == 91 || e.KeyValue == 92)
    {
        // left or right windows key was released
        _winKeyPressed = false;
    }
}

void gkh_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyValue == 91 || e.KeyValue == 92)
    {
        // left or right windows key was pressed
        _winKeyPressed = true;
    }

    if (e.KeyValue == 39 && _winKeyPressed == true)
    {
        // right key
        MessageBox.Show("This works.");
    }
}

【讨论】:

  • 我之前找到了这个 GlabalKeyboardHook 并尝试过,但对这个组合键没有帮助。它对你有用吗?
  • 我找到了如何让这段代码正常工作的方法。经过一些修改,它对 WinForm 工作稳定,对 WPFWindow 不太稳定
  • @melya - 尝试使用 e.KeyValue 而不是我最初推荐的 e.KeyCode。这个实现对我有用。在编辑后的答案中,我在 keydown 和 keyup 上检查 windows 键,并相应地设置一个布尔值来说明他们当前是否持有 windows 键。您可以使用其 KeyValue 整数常量处理箭头键。
  • @melya - 此外,将 e.Handled 设置为 true 将阻止 Windows 在您处理后看到按键。请记住,尽管用户可能只想按 Windows 键或向右箭头 - 请注意不要“破坏”其他 Windows 功能。
猜你喜欢
  • 2020-12-01
  • 1970-01-01
  • 2012-12-07
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-15
  • 2014-02-23
相关资源
最近更新 更多