0

我在这里尝试使用这篇文章: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());
            }
        }

显然,这是行不通的,因为 void 仅适用于每个键(如果我理解正确)

所以我真的需要一些帮助才能让它适用于组合键,例如 Ctrl + C 有人可以将我推向正确的方向吗?

4

3 回答 3

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;
        }
于 2013-06-13T13:51:42.527 回答
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);
}
于 2013-06-13T14:12:56.673 回答
0

前段时间我依靠RegisterHotKey函数,效果还不错。我在 VB.NET 中使用了它,仅用于 CTRL/SHIFT/ALT + 字母或数字的组合,但这里有一个非常详细的 C# 代码,允许更多组合。

于 2013-06-13T14:07:20.843 回答