2009-12-04 9 views
6

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:

  1. Disabilita la ripetizione chiave in Ubuntu.
  2. In Windows ospitanti: Attiva Filtro tasti con "Attiva la ripetizione dei tasti e Tasti lenti"
  3. Utilizzando regedit andare a HKEY_CURRENT_USER\Control Panel\Accessibility\Keyboard Response
    1. Impostare AutoRepeatDelay, AutoRepeatRate, eLast Valid Delay, Last Valid Repeat a abbastanza piccolo.
    2. Disattivare FilterKeys e riattivare per aggiornare le modifiche del Registro di sistema.

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.

+0

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

+0

Abel, no, ho creato un progetto vuoto solo per questo. – Ciantic

+0

Hai detto che sei sul desktop remoto. Puoi provarlo senza? Molto probabilmente, RD + Ubuntu ti sta giocando. – Abel

risposta

7

Perché non utilizzare le possibilità native? Ho aggiunto un evento PreviewKeyDown sulla finestra e due caselle di testo. Tenuto premuto un tasto nella seconda casella di testo e questo è l'output:

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 

Questo è il codice che ho usato:

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

Aggiornamento: rimosso tutti il ​​mio codice (ci era un po 'spazzatura da altri test) e incollato nel tuo codice così com'è. Mi dà il seguente risultato nella console, quindi raccolgo dovremmo dare un'occhiata ad altre cause ...

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

Qual è l'evento corretto? Come ho detto se cambio gli eventi in Anteprima * non riesce sul mio computer per impostare e.IsRepeat anche – Ciantic

+0

Notato la differenza: nessuno Ho provato quello che hai provato (ma solo dopo aver scritto questo post). Io uso .NET 3.5 SP1 con un normale progetto WPF. Aggiunta una finestra e poi il tuo codice. – Abel

+0

Appena testato senza casella di testo. Lavori. Quindi testato con il tuo codice. Lavori. Hmm ... .NET non aggiornato, keylogger sul tuo sistema? – Abel

0

Impostare una variabile quando l'evento keydown attiva il rilevamento di quale tasto è premuto, fare la cosa (tm) quindi ignorare ulteriori eventi per quella chiave. Quando la chiave attiva cancella la variabile. Potrebbe essere necessario un elenco per tenere traccia di più chiavi.

+0

Umh, giusto, vedi che il KeyUp è licenziato * sempre * anche, quindi non funzionerà in modo naturale – Ciantic

+0

Ma il modo in cui descrivi funzionerebbe se venisse usato un tempismo intelligente, ma questo è semplicemente folle ... Come ho notato in questione, ci deve essere un altro modo per rilevare la ripetizione dei tasti rispetto allo stack di eventi keyUp/KeyDown a distanza ravvicinata – Ciantic

+0

Nessun bisogno di tempismo intelligente, basta usare il 'IsRepeat' nell'evento corretto, è tutto lì – Abel

Problemi correlati