如何检测当前是否正在按任何键盘键?我对关键是什么不感兴趣,我只是想知道是否还有任何按键被按下。
if (Keyboard.IsKeyDown(Key.ANYKEY??)
{
}
答案 0 :(得分:10)
public static IEnumerable<Key> KeysDown()
{
foreach (Key key in Enum.GetValues(typeof(Key)))
{
if (Keyboard.IsKeyDown(key))
yield return key;
}
}
然后你可以这样做:
if(KeysDown().Any()) //...
答案 1 :(得分:4)
如果您想检测仅在我们的应用程序中按下的键(当您的WPF窗口被激活时),请添加KeyDown
,如下所示:
public MainWindow()
{
InitializeComponent();
this.KeyDown += new KeyEventHandler(MainWindow_KeyDown);
}
void MainWindow_KeyDown(object sender, KeyEventArgs e)
{
MessageBox.Show("You pressed a keyboard key.");
}
如果你想要检测何时按下某个键,即使你的WPF窗口没有激活也有点困难但是很有意思。我从Windows API推荐RegisterHotKey
(定义系统范围的热键)和UnregisterHotKey
。尝试在pinvoke.net或这些教程的C#中使用它们:
这是Microsoft Forums中的一个示例。
您将使用Virtual-Key Codes。 我希望我很清楚,你会理解我的答案。
答案 2 :(得分:2)
迭代System.Windows.Input.Key枚举值。
public static bool IsAnyKeyDown()
{
var values = Enum.GetValues(typeof(Key));
foreach (var v in values)
{
if (((Key)v) != Key.None)
{
if (Keyboard.IsKeyDown((Key)v))
{
return true;
}
}
}
return false;
}
答案 3 :(得分:1)
这里的答案很好......使用GetKeyboardState()
:
以上是检查键盘的实时状态。
如果您依赖于将事件挂钩到KeyDown / KeyUp事件以跟踪键盘的状态......那么这可能不那么准确。
这是因为你依靠消息来处理和发送那些KeyDown / KeyUp消息......它们可能会在真正的键盘状态再次发生变化后被传递。
另外因为当您对键盘状态感兴趣的代码正在运行时(通常在UI线程上)... KeyDown或KeyUp不能打断你...因为它们也在UI线程上调度....这就是为什么要使用GetKeyBoardState()
或Keyboard.IsKeyDown
的原因。
(以上假设你想要并关心现场状态)