web-dev-qa-db-fra.com

C # - Détection si la touche MAJ est maintenue lors de l'ouverture d'un menu contextuel

Dans mon application C #, je veux afficher un menu contextuel, mais je veux ajouter des options spéciales au menu si la touche MAJ est maintenue enfoncée lorsque le menu contextuel est ouvert.

J'utilise actuellement l'API GetKeyState pour vérifier la clé MAJ. Cela fonctionne 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 lorsqu'un menu contextuel est ouvert, il y a un indicateur qui indique dans le menu devrait afficher EXTENDEDVERBS. En C #, le EventArgs pour l'événement Opening ne contient pas (d'après ce que je peux dire) une propriété indiquant EXTENDEDVERBS ou si des touches de modification sont enfoncées.

Voici le code que j'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, mon code détecte-t-il correctement la touche MAJ enfoncée?

37
Chris Thompson

Vous pouvez utiliser la commande Propriété statique ModifierKeys pour déterminer si la touche Maj est maintenue.

if (Control.ModifierKeys == Keys.Shift ) { 
  ...
}

C'est une énumération de style de drapeau, donc en fonction de votre situation, vous voudrez peut-être faire 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é lancé. Cela peut ne pas être une différence significative pour votre application, mais il convient de le noter.

66
JaredPar

Utilisez-le pour détecter si la touche Maj est enfoncée:

if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) 
39
bobbyalex

C'est en fait beaucoup plus simple que tout ça

            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 simplement que votre projet référence PresentationCore et WindowsBase

14
Stephen Punak

Dans Silverlight, au moins dans les dernières versions, vous devez utiliser:

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

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

Sachez également que cela se déclenchera UNIQUEMENT si le shift la touche de modification est enfoncée et rien d'autre:

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

Si vous voulez simplement détecter si le shift est enfoncée, que vous appuyiez ou non sur une autre touche de modification, utilisez celle-ci:

if((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
{ ... }
3
FastJack