[英]How can I capture modifier (ctrl, alt, shift) key presses as a single key press in a C# console app?
[英]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
以外), HasFlag
為Keyboard.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.