簡體   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