簡體   English   中英

如何僅使用單個Alt修飾符檢測按鍵

[英]How to detect key press with only single Alt modifier

我只想在按下非修飾鍵時才能檢測到按鍵事件。 然后,我還想知道同時按下了哪些修飾鍵。

例如:
當我按Shift:_______時,我什么也不想輸出。
當我按Shift + A:_____時,我想輸出“ Shift A”。
當我按Shift + Alt + A:__時,我想輸出“ Shift + Alt A”
當我按Alt + A:_______我想輸出“ Alt A”

但是,“ Alt A”不會顯示,因為如果不按Shift / Ctrl,則無法通過Keyboard.IsKeyDown檢測到Alt鍵按下。

以下是我的測試代碼的一部分。

private void Window_KeyDown(object sender, KeyEventArgs e)
{
    Key key = e.Key;

    if (key.ToString().Contains("Ctrl") | key.ToString().Contains("Shift") | key.ToString().Contains("Alt"))
        return;

    Label_Test.Content = "";

    if (Keyboard.IsKeyDown(Key.LeftShift) | Keyboard.IsKeyDown(Key.RightShift))
    {
        if (Label_Test.Content.ToString() != "")
            Label_Test.Content += "+";
        Label_Test.Content += "Shift";
    }
    if (Keyboard.IsKeyDown(Key.LeftCtrl) | Keyboard.IsKeyDown(Key.RightCtrl))
    {
        if (Label_Test.Content.ToString() != "")
            Label_Test.Content += "+";
        Label_Test.Content += "Ctrl";
    }
    if (Keyboard.IsKeyDown(Key.LeftAlt) | Keyboard.IsKeyDown(Key.RightAlt))
    {
        if (Label_Test.Content.ToString() != "")
            Label_Test.Content += "+";
        Label_Test.Content += "Alt";
    }
    if (Keyboard.IsKeyDown(Key.System))
    {
        if (Label_Test.Content.ToString() != "")
            Label_Test.Content += "+";
        Label_Test.Content += "Alt";
    }
    if (Label_Test.Content.ToString() != "")
        Label_Test.Content += " ";
    Label_Test.Content += key.ToString();
}

我也試過

if (e.KeyboardDevice.Modifiers.ToString().Contains("Alt"))

但結果是一樣的。 如何檢測“ Alt + A”?



編輯:謝謝大家的幫助。 我編輯了最后一個if語句,它像這樣檢查Key.System,並且它按我的要求工作。

if (e.Key == Key.System)
{
    key = e.SystemKey;
    if (e.SystemKey.HasFlag(Key.LeftAlt) | e.SystemKey.HasFlag(Key.RightAlt))
        return;
    Label_Test.Content = "Alt";
}

要檢查是否僅按下了修飾符,將e.Key與所有修飾符進行比較,在這種情況下,返回空字符串。

如果e.Key不是修飾鍵,則需要將其與當前按下的修飾符一起打印。 要獲得這些修飾符,只需遍歷ModifierKeys枚舉的所有值(除None以外), HasFlagKeyboard.Modifiers上的每個值調用HasFlag

private void Window_KeyDown(object sender, KeyEventArgs e)
{
    var modifierKeys = new[]
    {
        Key.LeftCtrl, Key.RightCtrl,
        Key.LeftAlt, Key.RightAlt,
        Key.LeftShift, Key.RightShift,
        Key.LWin, Key.RWin
    };

    var key = e.Key;
    if (key == Key.System)
        key = e.SystemKey;
    else if (key == Key.ImeProcessed)
        key = e.ImeProcessedKey;

    if (modifierKeys.Contains(key))
    {
        Label_Test.Content = string.Empty;
        return;
    }

    var modifiers = Keyboard.Modifiers;
    var modifiersPressed = Enum.GetValues(typeof(ModifierKeys))
                               .OfType<ModifierKeys>()
                               .Where(k => k != ModifierKeys.None && modifiers.HasFlag(k));

    Label_Test.Content = string.Join("+", modifiersPressed.OfType<object>()
                                                          .Concat(new object[] { key }));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM