如何检测是否按下任何键

如何检测当前是否正在按任何键盘键? 我对关键是什么不感兴趣,我只是想知道是否仍然按下了任何键。

if (Keyboard.IsKeyDown(Key.ANYKEY??) { } 

 public static IEnumerable KeysDown() { foreach (Key key in Enum.GetValues(typeof(Key))) { if (Keyboard.IsKeyDown(key)) yield return key; } } 

你可以这样做:

 if(KeysDown().Any()) //... 

如果你想检测只在我们的应用程序中按下的键(当你的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#中使用它们:

  • 全局热键:注册即使表单未聚焦时也会触发的热键。
  • 启用Hotkey和ShortcutInput用户控件的简单步骤

这是Microsoft论坛中的一个示例。

您将使用虚拟密钥代码 。 我希望我很清楚,你会理解我的答案。

迭代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; } 

这里的答案很好…使用GetKeyboardState()立即获取所有keystates的集合:

  • 检测是否在C#中按下任何键(不是A,B,但是任何键)

以上是检查键盘的实时状态。

如果您依赖挂钩事件直到KeyDown / KeyUp事件来跟踪键盘的状态……那么这可能不那么准确。

这是因为你依靠消息来处理和发送那些KeyDown / KeyUp消息……它们可能在真正的键盘状态再次改变之后被传递。

另外因为当您对键盘状态感兴趣的代码正在运行时(通常在UI线程上)… KeyDown或KeyUp不能打断你…因为它们也在UI线程上调度…这就是使用GetKeyBoardState()Keyboard.IsKeyDown的原因。

(以上假设您想要并关心实时状态)