键盘钩获取组合键(WPF)

时间:2013-06-13 13:46:20

标签: c# wpf keyboard hook

我在这里尝试使用这篇文章:Using global keyboard hook (WH_KEYBOARD_LL) in WPF / C# 我已经成功地工作了。

但有些东西让我的手指无法理解。 它可以检测到按下的每一个键,但我想让我的应用程序在组合键上执行某些操作。

void KListener_KeyDown(object sender, RawKeyEventArgs args)
        {
            Console.WriteLine(args.Key.ToString());
            if (args.Key == Key.LeftCtrl && args.Key == Key.C)
            {
                MessageBox.Show(args.Key.ToString());
            }
        }

很明显,这不起作用,因为虚空仅适用于每一个键(如果我理解正确的话)

所以我真的需要一些帮助来使其适用于组合键,例如Ctrl + C. 有人会把我推向正确的方向吗?

3 个答案:

答案 0 :(得分:6)

存储按下的键的值,下次调用方法时,检查此存储值和实际值是否为组合键。

    var lastKey;
void KListener_KeyDown(object sender, RawKeyEventArgs args)
        {

            Console.WriteLine(args.Key.ToString());
            if (lastKey == Key.LeftCtrl && args.Key == Key.C)
            {
                MessageBox.Show(args.Key.ToString());
            }
           lastKey = args.Key;
        }

答案 1 :(得分:1)

为确保用户实际按下组合键,您必须检查两个键的状态,因此您必须跟踪其状态。

方法可以是:

List<Key> keys = new List<Key>();

void KListener_KeyDown(object sender, RawKeyEventArgs args)
{
   SetKeyDown(args.key);

   if(IsKeyDown(Key.LeftCtrl) && IsKeyDown(Key.C))
       MessageBox.Show("Woot!");
}

void KListener_KeyUp(object sender, RawKeyEventArgs args)
{
    SetKeyUp(args.key);
}

private bool IsKeyDown(Key key)
{
    return keys.Contains(key);
}

private void SetKeyDown(Key key)
{
    if(!keys.Contains(key)) 
        keys.Add(key);
}

private void SetKeyUp(Key key)
{
    if(keys.Contains(key)) 
        keys.Remove(key);
}

答案 2 :(得分:0)

前段时间我依赖于RegisterHotKey函数,结果非常好。我在VB.NET中使用它,只是用于CTRL / SHIFT / ALT +字母或数字的组合,但是你可以a pretty detailed C# code允许更多的组合。