如何检测是否按下任何键

时间:2012-08-22 15:06:22

标签: c# wpf c#-4.0

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

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

}

4 个答案:

答案 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的原因。

(以上假设你想要并关心现场状态)