我在这里尝试使用这篇文章: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. 有人会把我推向正确的方向吗?
答案 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允许更多的组合。