Czy istnieją jakieś globalne konstrukcje, których mogę użyć, gdy potrzebuję dostępu do przycisków Control, Shift, Alt? Na przykład wewnątrz MouseDown
zdarzenia TreeView
.
Jeśli tak to jak?
Czy istnieją jakieś globalne konstrukcje, których mogę użyć, gdy potrzebuję dostępu do przycisków Control, Shift, Alt? Na przykład wewnątrz MouseDown
zdarzenia TreeView
.
Jeśli tak to jak?
Odpowiedzi:
Użyj klasy Keyboard
. Używając Keyboard.IsKeyDown
możesz sprawdzić, czy Control, Shift, Alt są teraz wyłączone.
Na zmianę:
if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
{ /* Your code */ }
Do kontroli:
if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
{ /* Your code */ }
Dla Alt:
if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
{ /* Your code */ }
Jest także:
// Have to get this value before opening a dialog, or user will have released the control key
if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
{
}
Keyboard.Modifiers == ModifierKeys.Shift
instrukcji. Jeśli chcesz złapać klawisz Shift, ale nie obchodzi cię, czy inne modyfikatory są naciskane w tym samym czasie, użyj (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift
lub znacznie lepszej składni HasFlagKeyboard.Modifiers.HasFlag(ModifierKeys.Shift)
WIN+RightArrow
.
Keyboard.Modifiers
pokazuje jakoNone
private bool IsShiftKey { get; set; }
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
IsShiftKey = Keyboard.Modifiers == ModifierKeys.Shift ? true : false;
if ((Key.Oem3 == e.Key || ((IsShiftKey && Key.Oem4 == e.Key) || (IsShiftKey && Key.Oem6 == e.Key) || (IsShiftKey && Key.Oem5 == e.Key)) && (validatorDefn as FormatValidatorDefinition).format == "packedascii"))
{
e.Handled = true;
}
}
Tak sobie z tym radzę (za pomocą PreviewKeyDown), powiedzmy, że szukamy Alt + R ...
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt)
&& e.SystemKey == Key.R)
{
//do whatever
}
}
Może ktoś wyjaśni, dlaczego musiałem użyć e.SystemKey a nie tylko e.Key, może ze względu na modyfikator? ale to zadziałało bezbłędnie dla mnie podczas wyszukiwania modyfikatora + klawisz.
Częściowo pożyczam od @Josh i trochę podobny do @Krushik, a także odnosząc się do pytania o różnicę między KeyEventArgs.systemKey i KeyEventArgs.Key (odpowiedź, dlaczego Josh musi używać SystemKey); gdzie, z klawiszami modyfikującymi (takimi jak Alt), e.Key zwraca Key.System, a zatem 'prawdziwy' klucz znajduje się w e.SystemKey.
Aby obejść ten problem, najpierw pobierz „prawdziwy” klucz, a następnie wykonaj warunek:
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
// Fetch the real key.
var key = e.Key == Key.System ? e.SystemKey : e.Key;
if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
&& key == Key.Return)
{
// Execute your code.
}
}
(e.Key == Key.F && e.KeyboardDevice.Modifiers == ModifierKeys.Control)
zamiast wszystkich innych rzeczy ...