如何检测是否按下任何键
如何检测当前是否正在按任何键盘键? 我对关键是什么不感兴趣,我只是想知道是否仍然按下了任何键。
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
的原因。
(以上假设您想要并关心实时状态)