繁体   English   中英

如何检测是否按下了任何键

[英]How to detect if any key is pressed

如何检测当前是否按下了任何键盘键? 我对键是什么不感兴趣,我只想知道是否还有任何键被按下。

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 窗口未处于活动状态,也有点困难,但可能是可行的。 我从 Windows API 推荐RegisterHotKey (定义系统范围的热键)和UnregisterHotKey 尝试在来自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的原因。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM