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 MouseDownzdarzenia 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 MouseDownzdarzenia TreeView.
Jeśli tak to jak?
Odpowiedzi:
Użyj klasy Keyboard. Używając Keyboard.IsKeyDownmoż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.Shiftinstrukcji. 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.Shiftlub znacznie lepszej składni HasFlagKeyboard.Modifiers.HasFlag(ModifierKeys.Shift)
WIN+RightArrow.
Keyboard.Modifierspokazuje 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 ...