¿Hay algunas construcciones globales que puedo usar cuando necesito acceder si los botones Control, Shift, Alt están presionados? Por ejemplo dentroMouseDown
evento de a TreeView
.
¿Si es así, cómo?
¿Hay algunas construcciones globales que puedo usar cuando necesito acceder si los botones Control, Shift, Alt están presionados? Por ejemplo dentroMouseDown
evento de a TreeView
.
¿Si es así, cómo?
Respuestas:
Usa la clase Keyboard
. Utilizando Keyboard.IsKeyDown
puedes comprobar si Control, Shift, Alt está abajo ahora.
Por turno:
if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
{ /* Your code */ }
Para el control:
if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
{ /* Your code */ }
Para Alt:
if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
{ /* Your code */ }
También hay:
// 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
instrucción. Si desea captar la tecla Mayús pero no le importa si se presionan otros modificadores al mismo tiempo, use la (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift
sintaxis HasFlag o la mejor sintaxisKeyboard.Modifiers.HasFlag(ModifierKeys.Shift)
WIN+RightArrow
.
Keyboard.Modifiers
muestra comoNone
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;
}
}
Así es como lo manejo (usando PreviewKeyDown), digamos que estamos buscando Alt + R ...
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt)
&& e.SystemKey == Key.R)
{
//do whatever
}
}
Tal vez alguien pueda aclarar por qué tuve que usar e.SystemKey y no solo e.Key, ¿tal vez debido al modificador? pero esto ha funcionado perfectamente para mí cuando busco modificador + tecla.
En parte tomando prestado de @Josh, y algo similar a @Krushik, y también haciendo referencia a una pregunta sobre la diferencia entre KeyEventArgs.systemKey y KeyEventArgs.Key (respondiendo por qué Josh tiene que usar SystemKey); en donde, con las teclas modificadoras (como Alt), e.Key devuelve Key.System y, por lo tanto, la clave 'real' está dentro de e.SystemKey.
Una forma de evitar esto es buscar primero la clave 'real' y luego hacer su condicional:
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)
lugar de todas las demás cosas ...