自定义处理WinKey + ArrowKey组合

时间:2017-11-13 15:33:18

标签: c# .net wpf

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

1 个答案:

答案 0 :(得分: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.");
    }
}