2009-08-12 8 views
27

Come posso determinare in KeyDown che CtrlFino è stato premuto.KeyDown: riconoscere più chiavi

private void listView1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Control && e.KeyCode == Keys.Up) 
    { 
     //do stuff 
    } 
}  

non può funzionare, perché mai entrambi i tasti vengono premuti esattamente nello stesso secondo. È sempre in un primo momento la Ctrl e poi l'altro ...

risposta

-2

si deve ricordare i tasti premuti (ad esempio in un array bool). e imposta la posizione su 1 quando è premuto (keydown) e 0 quando è su.

in questo modo è possibile tenere traccia di più di una chiave. Io suggerisco di fare una serie di tasti speciali solo

modo da poter fare:

if (e.KeyCode == Keys.Control) 
{ 
     keys[0] = true; 
} 
// could do the same with alt/shift/... - or just rename keys[0] to ctrlPressed 

if (keys[0] == true && e.KeyCode == Keys.Up) 
doyourstuff 
27

È possibile controllare i modificatori delle KeyEventArgs in questo modo:

private void listView1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Up && e.Modifiers == Keys.Control) 
    { 
     //do stuff 
    } 
} 

MSDN reference

+3

Questo non è mai vero sulla mia tastiera - ad esempio, se premo LShiftKey e Keys.Up, esso e.Shift non sarebbe mai vero, e e.Modificatore rimarrà sempre None. Qualche idea del perché? – Zolomon

+2

Sembra che i tasti freccia siano in qualche modo speciali. Questa domanda fornisce alcune informazioni: http://stackoverflow.com/questions/1646998/up-down-left-and-right-arrow-keys-do-not-trigger-keydown-event –

+1

Ho trovato solo e.Key ma nessun e.KeyCode. Non c'è anche e.Modifier. – KMC

7

Nel KeyEventArgs ci sono immobili Ctrl, Alt e Spostamento che mostra se questi tasti vengono premuti.

+1

Grazie Funziona perfettamente! 'if (e.Control && e.KeyCode == Keys.A)' –

2

È possibile utilizzare la proprietà ModifierKeys:

if (e.KeyCode == Keys.Up && (ModifierKeys & Keys.Control) == Keys.Control) 
{ 
    // CTRL + UP was pressed 
} 

Nota che il valore ModifierKeys può essere una combinazione di valori, quindi se si desidera rilevare che CTRL è stato premuto indipendentemente dallo stato del SHIFT o ALT chiavi, sarà necessario eseguire un confronto bit a bit come nel mio esempio sopra. Se si vuole garantire che nessun altro modificatori sono stati premuti, si dovrebbe invece verificare la presenza di uguaglianza:

if (e.KeyCode == Keys.Up && ModifierKeys == Keys.Control) 
{ 
    // CTRL + UP was pressed 
} 
+0

Oltre [QUI] (http://stackoverflow.com/a/7078186/153923), hai detto che i dati si trovano nel campo KeyData. Nessuno qui ha menzionato [KeyData] (https://msdn.microsoft.com/en-us/library/system.windows.forms.keyeventargs.keydata.aspx). Queste risposte sono errate? – jp2code

+0

Buona cattura @ jp2code! 'ModifierKeys' è una proprietà su' Control' (come un modulo di Windows form) che ti darà informazioni su quali tasti modificatori che sono _currently_ essere premuti. 'KeyData' che viene fornito con gli eventi chiave contiene informazioni su quali tasti modificatori sono stati premuti insieme alla chiave che ha causato l'evento. In retrospettiva, direi che 'ModifierKeys' è più interessante insieme al clic del pulsante o eventi simili, e che sarebbe più accurato usare 'KeyData' durante gli eventi chiave. –

4

Puoi provare a utilizzare l'oggetto Keyboard per rilevare la proprietà IsKeyDown. Inoltre, se non vuoi che il collegamento del browser scorra, puoi impostare la proprietà Handled su true.Fai attenzione quando scorri le scorciatoie del browser in quanto potrebbe causare confusione.

private void Page_KeyDown(object sender, KeyEventArgs e) 
{ 
    // If leftCtrl + T is pressed autofill username 
    if (Keyboard.IsKeyDown(Key.T) && Keyboard.IsKeyDown(Key.LeftCtrl)) 
    { 
     txtUser.Text = "My AutoFilled UserName"; 
     e.Handled = true; 
    } 
} 
+0

Nota: questo è WPF. – TaW

+1

@TaW - Stiamo eseguendo un'applicazione XBAP (WPF in esecuzione in Internet Explorer). Quindi in quel caso hai ancora bisogno di usare il tratto chiave come 'Handled' o IE lo prenderà. XBAP non è un framework molto diffuso, ma ho pensato di farti sapere perché stavo discutendo sulla gestione dei browser :) - Grazie. – zulumojo

0

questo funzionerà di sicuro. Prestare attenzione a gestire l'evento KeyUp e non keyDown.

private void mainForm_KeyUp(object sender, KeyEventArgs e) 
    { 
     if (e.Modifiers == Keys.Control && e.KeyCode == Keys.A) 
     { 
      //insert here 
     } 
    } 

Per me, keyDown non ha funzionato, keyU p lavorato invece per lo stesso codice.

Non so perché, ma sembra a causa keyDown evento si verifica subito dopo aver premuto un tasto, anche se questo era ctrl chiave, quindi se si è premuto Ctrl + Up potrete premere ctrl prima della chiave UP e quindi l'evento si verificherà prima che sia possibile premere l'altro, anche premendo il secondo tasto si attiverà nuovamente l'evento.

Durante l'utilizzo KeyUp non attivare l'evento fino a quando si rilascia il tasto, in modo da poter premere ctrl , e la stampa il secondo tasto, che attiverà un evento.

-1

si può provare il mio codice di lavoro:

private void listView1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Up) 
    { 
     if(e.Alt==true){ 
      //do your stuff 
     } 
    } 
} 

io uso questo codice, perché io non so perché quando uso:

(e.Keycode == Keys>up && e.Alt==true) 

non ha funzionato.

0
private void listView1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Up && Keyboard.IsKeyDown(Key.LeftCtrl)) 
    { 
     //do stuff 
    } 
} 

Questo codice funziona solo se si preme prima LeftCtrl, poi "UP". Se l'ordine non ha importanza, vi consiglio uno:

if ((Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))&& Keyboard.IsKeyDown(Key.Z)) 
{ 
    //do stuff 
} 

In questo caso, entrambi Ctrl sono presi in considerazione, e nessuna importanza sull'ordine.