Há algumas construções globais que eu posso usar sempre que precisar acessar se os botões Control, Shift, Alt estão pressionados? Por exemplo, MouseDown
evento interno de a TreeView
.
Se sim, como?
Há algumas construções globais que eu posso usar sempre que precisar acessar se os botões Control, Shift, Alt estão pressionados? Por exemplo, MouseDown
evento interno de a TreeView
.
Se sim, como?
Respostas:
Use classe Keyboard
. Usando Keyboard.IsKeyDown
você pode verificar se Control, Shift, Alt está desativado agora.
Para Turno:
if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
{ /* Your code */ }
Para controle:
if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
{ /* Your code */ }
Para Alt:
if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
{ /* Your code */ }
Há também:
// 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
instrução Se você quiser pegar a tecla shift, mas cuidado Não se outros modificadores são pressionadas ao mesmo tempo, use o (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift
ou o muito melhor sintaxe HasFlagKeyboard.Modifiers.HasFlag(ModifierKeys.Shift)
WIN+RightArrow
.
Keyboard.Modifiers
mostra 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;
}
}
É assim que eu manejo isso (usando o PreviewKeyDown), digamos que estamos procurando Alt + R ...
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt)
&& e.SystemKey == Key.R)
{
//do whatever
}
}
Talvez alguém possa esclarecer por que eu tive que usar o e.SystemKey e não apenas o e.Key, talvez devido ao modificador? mas isso funcionou perfeitamente para mim ao procurar pelo modificador + chave.
Parcialmente emprestado do @Josh e um pouco semelhante ao @Krushik, e também fazendo referência a uma pergunta sobre a diferença entre KeyEventArgs.systemKey e KeyEventArgs.Key (respondendo por que Josh precisa usar o SystemKey); em que, com as teclas modificadoras (como Alt), o e.Key retorna Key.System e, portanto, a chave 'real' está dentro do e.SystemKey.
Uma maneira de contornar isso é buscar primeiro a chave 'real' e, em seguida, fazer o seu 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)
em vez de todas as outras coisas ...