NOTA: e.IsRepeat
ha confermato di funzionare. Il problema esiste perché utilizzo il desktop remoto da Ubuntu a Windows.WPF: come rilevare la ripetizione della chiave, in eventi chiave *?
ho trovato una soluzione per questo problema Remote Desktop:
- Disabilita la ripetizione chiave in Ubuntu.
- In Windows ospitanti: Attiva Filtro tasti con "Attiva la ripetizione dei tasti e Tasti lenti"
- Utilizzando regedit andare a
HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response
- Impostare
AutoRepeatDelay
,AutoRepeatRate
, eLast Valid Delay
,Last Valid Repeat
a abbastanza piccolo. - Disattivare FilterKeys e riattivare per aggiornare le modifiche del Registro di sistema.
- Impostare
Come si fa a rilevare la ripetizione chiave KeyUp
/KeyDown
(o PreviewKeyDown
/PreviewKeyUp
) eventi?
Ho seguito banco di prova:
public Window1() {
InitializeComponent();
this.KeyDown += new KeyEventHandler(Window1_KeyDown);
this.KeyUp += new KeyEventHandler(Window1_KeyUp);
}
void Window1_KeyUp(object sender, KeyEventArgs e) {
if (e.Key == Key.D) {
Console.WriteLine("DOWN: key: {0}, rep{1}, togg{2}, dow{3}, up{4}", e.Key, e.IsRepeat, e.IsToggled, e.IsDown, e.IsUp);
}
}
void Window1_KeyDown(object sender, KeyEventArgs e) {
if (e.Key == Key.D) {
Console.WriteLine("UP: key: {0}, rep{1}, togg{2}, dow{3}, up{4}", e.Key, e.IsRepeat, e.IsToggled, e.IsDown, e.IsUp);
}
}
Mi dà a schermo uscita seguente se premo lettera D verso il basso e rilasciarlo dopo un po ':
// Note: Here I press D-key down.
UP: key: D, repFalse, toggTrue, dowTrue, upFalse
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue
UP: key: D, repFalse, toggFalse, dowTrue, upFalse
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue
UP: key: D, repFalse, toggTrue, dowTrue, upFalse
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue
UP: key: D, repFalse, toggFalse, dowTrue, upFalse
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue
UP: key: D, repFalse, toggTrue, dowTrue, upFalse
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue
UP: key: D, repFalse, toggFalse, dowTrue, upFalse
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue
UP: key: D, repFalse, toggTrue, dowTrue, upFalse
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue
UP: key: D, repFalse, toggFalse, dowTrue, upFalse
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue
UP: key: D, repFalse, toggTrue, dowTrue, upFalse
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue
UP: key: D, repFalse, toggFalse, dowTrue, upFalse
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue
UP: key: D, repFalse, toggTrue, dowTrue, upFalse
DOWN: key: D, repFalse, toggTrue, dowFalse, upTrue
UP: key: D, repFalse, toggFalse, dowTrue, upFalse
DOWN: key: D, repFalse, toggFalse, dowFalse, upTrue
// Note: Here I release D-key.
A quanto pare il e.IsRepeat
è sempre falso, quindi è inutile. Ho anche notato che a volte il primo evento è anche toggFalse, dowTrue, quindi non può essere usato come modello.
Ho anche notato che il modo intelligente di usare il tempo può essere usato per rilevare la ripetizione, ma ci deve essere un modo nativo per farlo.
Osservando oltre: ho notato che non posso ripetere l'esperimento. Sia che si utilizzi le caselle di testo, sia che si scriva su console, sia in debug o in versione, sia in KeyDown che in PreviewKeyDown, imposta sempre "IsRepeat'. C'è una parte del tuo codice non mostrata? – Abel
Abel, no, ho creato un progetto vuoto solo per questo. – Ciantic
Hai detto che sei sul desktop remoto. Puoi provarlo senza? Molto probabilmente, RD + Ubuntu ti sta giocando. – Abel