Come rilevare gli stati chiave del modificatore in WPF?


151

Esistono alcuni costrutti globali che posso usare ogni volta che devo accedere se i pulsanti Control, Shift, Alt sono abbassati? Ad esempio all'interno MouseDowndell'evento di a TreeView.

Se é cosi, come?

Risposte:


257

Usa la classe Keyboard. Usando Keyboard.IsKeyDownpuoi controllare se Control, Shift, Alt è inattivo ora.

Per il turno:

if (Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))
{ /* Your code */ }

Per controllo:

if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
{ /* Your code */ }

Per Alt:

if (Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt))
{ /* Your code */ }

125

C'è anche:

// Have to get this value before opening a dialog, or user will have released the control key
if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
{

}

13
Soluzione molto migliore. Ti permette anche di controllare tutti i modificatori contemporaneamente. Se vuoi gestire Ctrl + F, non vorrai gestire Ctrl + Maiusc + F, quindi potresti semplicemente cercare (e.Key == Key.F && e.KeyboardDevice.Modifiers == ModifierKeys.Control)invece di tutte le altre cose ...
ygoe

35
Si noti che i confronti negli esempi precedenti producono risultati diversi! Poiché l'enumerazione ModifierKeys ha l'attributo Flags, puoi avere qualsiasi combinazione di valori nell'enum. Se si desidera catturare SOLO il tasto Maiusc premuto, utilizzare l' Keyboard.Modifiers == ModifierKeys.Shiftistruzione. Se vuoi prendere il tasto MAIUSC ma non preoccuparti se vengono premuti contemporaneamente altri modificatori, usa la (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shiftsintassi HasFlag o molto meglioKeyboard.Modifiers.HasFlag(ModifierKeys.Shift)
Patrik B

4
Non sono riuscito a catturare il modificatore di chiave di Windows usando questo metodo. (CTRL ha funzionato bene.) Stavo cercando di catturare WIN+RightArrow.
ANeves

1
@ANeves Interessante, Keyboard.Modifiersmostra comeNone
Chuck Savage

8
    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;
        }
    }

2
Le risposte sono migliori con commenti e codice. Fornisci un contesto.
Chris,

1
ottima idea di aggiungerlo come proprietà
RollRoll

1
Quando ho usato PreviewKeyDown cercando Alt + un'altra chiave ho dovuto usare e.SystemKey invece di e.Key (il valore di e.Key era "Sistema" nel caso di usare alt + un altro personaggio, nel mio caso)
Josh

3

Ecco come lo gestisco (usando PreviewKeyDown), diciamo che stiamo cercando Alt + R ...

private void OnPreviewKeyDown(object sender, KeyEventArgs e)
{
    if ((Keyboard.IsKeyDown(Key.LeftAlt) || Keyboard.IsKeyDown(Key.RightAlt)
       && e.SystemKey == Key.R)
    {
       //do whatever
    }
}

Forse qualcuno può chiarire perché ho dovuto usare e.SystemKey e non solo e.Key, forse a causa del modificatore? ma questo ha funzionato perfettamente per me durante la ricerca di modificatore + tasto.


0

e anche:

se My.Computer.Keyboard.ShiftKeyDown quindi ...

My.Computer.Keyboard.CtrlKeyDown

My.Computer.Keyboard.AltKeyDown


0

Prendendo in prestito in parte da @Josh e in qualche modo simile a @Krushik, e facendo anche riferimento a una domanda sulla differenza tra KeyEventArgs.systemKey e KeyEventArgs.Key (rispondendo al motivo per cui Josh deve utilizzare SystemKey); in cui, con i tasti modificatori (come Alt), e.Key restituisce Key.System, e quindi la chiave "reale" si trova all'interno di e.SystemKey.

Un modo per aggirare questo, è prima di prendere la chiave 'reale', e quindi fare il tuo condizionale:

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.
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.