2009-08-12 6 views
27

Comment puis-je déterminer dans KeyDown que CtrlUp a été pressé.KeyDown: reconnaître plusieurs clés

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

ne peut pas fonctionner, car les deux touches ne sont jamais pressées exactement dans la même seconde. Vous devez toujours d'abord Ctrl et puis l'autre ...

Répondre

-2

vous devez vous rappeler les touches enfoncées (c'est-à-dire dans un tableau bool). et réglez la position sur 1 quand elle est pressée (keydown) et 0 quand elle est levée.

De cette façon, vous pouvez suivre plusieurs clés. Je suggère de faire un tableau pour les touches spéciales ne

vous pouvez donc faire:

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

Vous pouvez vérifier les modificateurs des KeyEventArgs comme ceci:

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

MSDN reference

+3

Cela n'est jamais vrai sur mon clavier - par exemple, si j'appuie sur LShiftKey et Keys.Up, cela ne sera jamais vrai, et e.Modifiers restera toujours None. Une idée pourquoi? – Zolomon

+2

Il semble que les touches fléchées sont spéciales d'une manière ou d'une autre. Cette question donne un aperçu: http://stackoverflow.com/questions/1646998/up-down-left-and-right-arrow-keys-do-not-trigger-keydown-event –

+1

Je trouve seulement qu'il y a e.Key mais pas e.KeyCode. Il n'y a pas non plus e.Modifier. – KMC

7

Dans le KeyEventArgs il y a des propriétés Ctrl, Alt et Maj qui montre si ces touches sont enfoncées.

+1

Merci Cela a fonctionné parfaitement! 'if (e.Control && e.KeyCode == Keys.A)' –

2

Vous pouvez utiliser la propriété ModifierKeys:

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

Notez que la valeur de ModifierKeys peut être une combinaison de valeurs, donc si vous voulez détecter que CTRL a été pressée indépendamment de l'état de la SHIFT ou ALT clés, vous devrez effectuer une comparaison bit à bit comme dans mon exemple ci-dessus. Si vous voulez vous assurer qu'aucun autre modificateurs ont été pressés, vous devriez plutôt vérifier l'égalité:

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

Sur [HERE] (http://stackoverflow.com/a/7078186/153923), vous avez dit que les données se trouvent dans le champ KeyData. Personne ici n'a mentionné [KeyData] (https://msdn.microsoft.com/fr-fr/library/system.windows.forms.keyeventargs.keydata.aspx). Ces réponses sont-elles incorrectes? – jp2code

+0

Bonne capture @ jp2code! 'ModifierKeys' est une propriété de' Control' (comme un formulaire de formulaires Windows) qui vous donnera des informations sur les touches de modification qui sont actuellement pressées. 'KeyData' fourni avec les événements key contient des informations sur les touches de modification qui ont été pressées avec la clé qui a provoqué l'événement. Rétrospectivement, je dirais que 'ModifierKeys' est plus intéressant avec un clic de bouton ou des événements similaires, et qu'il serait plus précis d'utiliser' KeyData' pendant les événements clés. –

4

Vous pouvez essayer d'utiliser l'objet Keyboard pour détecter la propriété IsKeyDown. En outre, si vous ne voulez pas que le raccourci du navigateur dépasse, vous pouvez définir la propriété Handled sur true. Soyez prudent lorsque vous surfez sur les raccourcis du navigateur, car cela pourrait entraîner une confusion.

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

Note: Ceci est WPF. – TaW

+1

@TaW - Nous exécutons une application XBAP (WPF fonctionnant dans Internet Explorer). Donc, dans ce cas, vous devez toujours utiliser le coup de clé comme 'Handled' ou IE le ramassera. XBAP n'est pas un framework très utilisé, mais j'ai pensé que je te ferais savoir pourquoi je parlais de la gestion des navigateurs du tout :) - Merci. – zulumojo

0

cela fonctionnera à coup sûr. Veillez à gérer l'événement KeyUp et non keyDown.

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

Pour moi, keyDown ne fonctionne pas, p keyU a travaillé à la place pour le même code.

Je ne sais pas pourquoi, mais il semble que l'événement se produit keyDown directement après avoir appuyé sur une touche, même si cela ctrl clé, donc si vous appuyez sur Ctrl + Up vous appuyez sur ctrl touche avant la touche UP et donc l'événement se produira avant que vous puissiez appuyer sur l'autre, également en appuyant sur la deuxième touche va déclencher à nouveau l'événement.

Lors de l'utilisation KeyUp ne déclenche pas l'événement jusqu'à ce que vous relâchez la touche, vous pouvez appuyer sur ctrl , et appuyez sur la seconde touche, ce qui déclenchera un événement.

-1

vous pouvez essayer mon code de travail:

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

-je utiliser ce code parce que je ne sais pas pourquoi quand je l'utilise:

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

ne fonctionne pas.

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

Ce code ne fonctionnera que si vous appuyez sur une première LeftCtrl, puis "UP". Si l'ordre n'a pas d'importance, je recommande que l'on:

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

Dans ce cas, les touches CTRL sont prises en compte, et aucune importance de l'ordre.

Questions connexes