2009-06-10 10 views
33

Dans mon application C#, je souhaite afficher un menu contextuel, mais je souhaite ajouter des options spéciales au menu si la touche MAJ est enfoncée lorsque le contexte le menu est ouvert.C# - Détecter si la touche MAJ est enfoncée lors de l'ouverture d'un menu contextuel

J'utilise actuellement l'API GetKeyState pour vérifier la touche MAJ. Cela fonctionne très bien sur mon ordinateur mais les utilisateurs avec Windows non anglais disent que cela ne fonctionne pas du tout pour eux.

J'ai également lu que dans l'API Win32 quand un menu contextuel est ouvert, il y a un drapeau qui indique dans le menu devrait afficher EXTENDEDVERBS. En C# le EventArgs pour l'événement Opening ne contient pas (de ce que je peux dire) une propriété indiquant EXTENDEDVERBS ou si des touches de modification sont enfoncées.

Voici le code que je utilise maintenant dans l'événement « Opening »:

// SHIFT KEY is being held down 
if (Convert.ToBoolean(GetKeyState(0x10) & 0x1000)) 
{ 
    _menuStrip.Items.Add(new ToolStripSeparator()); 

    ToolStripMenuItem log = new ToolStripMenuItem("Enable Debug Logging"); 
    log.Click += new EventHandler(log_Click); 
    log.Checked = Settings.Setting.EnableDebugLogging; 
    _menuStrip.Items.Add(log); 
} 

Si GetKeyState est la bonne façon de le faire, est mon code correctement détecter la touche MAJ enfoncée en cours?

Répondre

60

Vous pouvez utiliser le ModifierKeys static property sur le contrôle pour déterminer si la touche Maj est maintenue. Ceci est une énumération de style de drapeau bien qu'en fonction de votre situation, vous souhaitiez effectuer des tests plus rigoureux. Notez également que cela vérifiera si la touche Maj est maintenue au moment où vous vérifiez la valeur. Pas le moment où le menu ouvert a été initié. Cela peut ne pas être une différence significative pour votre application, mais il vaut la peine de le noter.

+0

Malheureusement, les parents de l'ContextMenu dans mon code est un UserControl et la propriété ModifierKeys ne sont pas disponibles soit pour le UserContr ol ou pour l'objet ContextMenu. –

+0

@Chris - Comme Jared dit que c'est statique. J'ai mis à jour sa réponse avec un lien vers msdn –

+0

Je n'ai pas remarqué cela. Je pensais que c'était une propriété d'instance. Je vais le tester. –

37

Utilisez cette option pour détecter si la touche Maj enfoncée est pressée:

if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) 
+0

Au moment où j'ai tapé cette réponse, Jared l'avait déjà posté. Désolé pour le doublon. – bobbyalex

+0

Chris a raison. La propriété doit être disponible pour vous même si vous utilisez un UserControl. – bobbyalex

+11

Ceci vérifie si la touche Shift est enfoncée, ce qui est ce que voulait la question originale. L'autre réponse vérifie si SEULEMENT la touche Maj est enfoncée. – adzm

3

En silverlight, au moins dans les dernières versions, vous devez utiliser:

if(Keyboard.Modifiers == ModifierKeys.Shift) { 
    ... 
} 
12

Il est en fait beaucoup plus simple que tout cela

  if(Keyboard.IsKeyDown(Key.LeftCtrl) || 
       Keyboard.IsKeyDown(Key.RightCtrl) || 
       Keyboard.IsKeyDown(Key.LeftAlt) || 
       Keyboard.IsKeyDown(Key.RightAlt) || 
       Keyboard.IsKeyDown(Key.LeftShift) || 
       Keyboard.IsKeyDown(Key.RightShift)) 
      { 
       /** do something */ 
      } 

assurez-vous que votre projet fait référence PresentationCore et WindowsBase

2

Keyboard.Modifiers fonctionne également avec des projets WPF réels!
Aussi, je recommanderais son utilisation sur Keyboard.GetKeyStates parce que le dernier utilise le déclenchement et peut ne pas refléter l'état réel de la clé.

Il faut aussi savoir que cela déclenchera uniquement si la touche de modification de changement est en baisse et rien d'autre:

if(Keyboard.Modifiers == ModifierKeys.Shift) 
{ ... } 

Si vous voulez juste pour détecter si la clé de changement est en baisse, si un autre modificateur touche est pressée ou non, utilisez celui-ci:

if((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift) 
{ ... } 
Questions connexes