2009-12-04 18 views
6

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:

  1. Desactivar la repetición clave en Ubuntu.
  2. En Windows anfitrionas: Activar FilterKeys con "Activar Teclas de repetición y teclas lentas"
  3. Usando regedit ir a HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response
    1. Establecer AutoRepeatDelay, AutoRepeatRate, y Last Valid Delay, Last Valid Repeat a pequeña suficiente.
    2. Desactive FilterKeys y vuelva a habilitar para actualizar los cambios en el registro.

¿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.

+0

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

+0

Abel, no, creé un proyecto vacío solo para esto. – Ciantic

+0

Dice que está en el escritorio remoto. ¿Puedes probarlo sin? Muy probablemente, RD + Ubuntu te están jugando partes. – Abel

Respuesta

7

¿Por qué no utilizar las posibilidades nativas? Agregué un evento PreviewKeyDown en la ventana y dos cuadros de texto. Al mantenerla presionada una tecla en el segundo cuadro de texto y este es el resultado:

Repeat: False, key: D 
Repeat: True, key: D 
Repeat: True, key: D 
Repeat: True, key: D 
Repeat: True, key: D 
Repeat: True, key: D 
Repeat: True, key: D 
Repeat: True, key: D 

Este es el código que utilicé:

private void Grid_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    textBox1.Text += String.Format(
     "Repeat: {0}, key: {1}\n", 
     e.IsRepeat, 
     e.Key); 
} 

Actualización: quitado todo mi código (hay fue basura de otras pruebas) y pegado en su código tal como está. Me da el siguiente resultado en la consola, así que creo que deberíamos echarle un vistazo a otras causas ...

UP: key: D, repFalse, toggTrue, dowTrue, upFalse 
UP: key: D, repTrue, toggTrue, dowTrue, upFalse 
UP: key: D, repTrue, toggTrue, dowTrue, upFalse 
UP: key: D, repTrue, toggTrue, dowTrue, upFalse 
UP: key: D, repTrue, toggTrue, dowTrue, upFalse 
UP: key: D, repTrue, toggTrue, dowTrue, upFalse 
+0

¿Cuál es el evento correcto? Como dije, si cambio los eventos a la vista previa *, falla en mi computadora para configurar e.IsRepeat también. – Ciantic

+0

Noté la diferencia: ninguno. Intenté lo que intentaste (pero solo después de escribir esta publicación)) Uso .NET 3.5 SP1 con un proyecto normal de WPF. Se agregó una ventana y luego tu código. – Abel

+0

Acabado probado sin cuadro de texto. Trabajos. Luego probado con tu código. Trabajos. Hmm ... .NET no está actualizado, keylogger en su sistema? – Abel

0

Establezca una variable cuando el evento de selección desencadena el seguimiento de la tecla que se presiona, haga lo suyo (tm) y luego ignore otros eventos para esa clave. Cuando los disparos de tecla despejan la variable. Es posible que necesite una lista para rastrear varias claves.

+0

Umh, a la derecha, vea que el KeyUp está activado * siempre * también, por lo que no funcionará naturalmente. – Ciantic

+0

Pero la forma en que describió funcionaría si se usara una temporización inteligente, pero eso es una locura ... Como noté en cuestión, debe haber otra forma de detectar la repetición de la tecla que apilar los eventos keyUp/KeyDown cercanos sincronizados. – Ciantic

+0

No necesita tiempo inteligente, solo use el 'IsRepeat' en el evento correcto, está todo allí. – Abel

Cuestiones relacionadas