NOTA: e.IsRepeat
ha sido confirmado para funcionar. El problema existe porque utilizo Escritorio remoto de Ubuntu a Windows.WPF: ¿Cómo detectar la repetición de teclas, en Key * events?
He encontrado una solución para este problema Escritorio remoto:
- Desactivar la repetición clave en Ubuntu.
- En Windows anfitrionas: Activar FilterKeys con "Activar Teclas de repetición y teclas lentas"
- Usando regedit ir a
HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response
- Establecer
AutoRepeatDelay
,AutoRepeatRate
, yLast Valid Delay
,Last Valid Repeat
a pequeña suficiente. - Desactive FilterKeys y vuelva a habilitar para actualizar los cambios en el registro.
- Establecer
¿Cómo se puede detectar la repetición clave en KeyUp
/KeyDown
(o PreviewKeyDown
/PreviewKeyUp
) eventos?
he caso siguiente prueba:
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);
}
}
Me da a pantalla de salida siguiente si presiono la letra D y liberan después de un tiempo:
// 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.
Al parecer, el e.IsRepeat
es siempre falso, entonces eso es inútil. También noté que a veces el primer evento también es toggFalse, dowTrue, por lo que no se puede usar como patrón.
También observo que la forma inteligente de usar el tiempo se puede utilizar para detectar la repetición, pero debe haber una manera nativa de hacerlo.
Mirando más allá: Noté que no puedo repetir su experimento. Ya sea que use cuadros de texto, ya sea escribiendo a consola, ya sea en depuración o en versión, ya sea en KeyDown o PreviewKeyDown, siempre establece el 'IsRepeat'. ¿Hay alguna parte de tu código que no se muestra? – Abel
Abel, no, creé un proyecto vacío solo para esto. – Ciantic
Dice que está en el escritorio remoto. ¿Puedes probarlo sin? Muy probablemente, RD + Ubuntu te están jugando partes. – Abel