如何检测当前是否按下了任何键盘键?我对键是什么不感兴趣,我只想知道是否仍然按下任何键。
if (Keyboard.IsKeyDown(Key.ANYKEY??)
{
}
public static IEnumerable<Key> 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 窗口未处于活动状态,这也有点困难,但也是可行的。我推荐RegisterHotKey
(定义系统范围的热键)和UnregisterHotKey
Windows API。尝试在pinvoke.net或这些教程中的 C# 中使用这些:
这是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 && Keyboard.IsKeyDown((Key)v)
return true;
return false;
}
很好的答案......使用以下命令一次获取所有键状态的集合GetKeyboardState()
:
以上是检查键盘的实时状态。
如果您依靠将事件与 KeyDown/KeyUp 事件挂钩来跟踪键盘的状态……那么这可能不那么准确。
那是因为您依靠消息泵来处理和发送这些 KeyDown/KeyUp 消息......它们可能会在真正的键盘状态再次改变后被传递。
还因为当您对键盘状态感兴趣的代码正在运行时(通常在 UI 线程上)...... KeyDown 或 KeyUp 不能打断你......因为它们也在 UI 线程上调度...... .这就是为什么使用GetKeyBoardState()
或Keyboard.IsKeyDown
应该使用的原因。
(以上假设您想要并关心实时状态)