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

Dans mon application C# je veux afficher un menu contextuel, mais je tiens à ajouter des options au menu si la touche MAJ est enfoncée lorsque le menu contextuel s'ouvre.

j'utilise actuellement le GetKeyState API pour vérifier la touche MAJ. Il fonctionne très bien sur mon ordinateur, mais les utilisateurs avec Windows non-anglais disent qu'il ne fonctionne pas du tout pour eux.

j'ai aussi 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#EventArgs pour les Opening événement ne contient pas (de ce que je peux dire) une propriété indiquant EXTENDEDVERBS ou si des touches modificatrices sont pressées.

voici le code que j'utilise maintenant dans le "Opening" de l'événement:

// 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-ce que mon code détecte correctement la touche SHIFT pressée?

33
demandé sur Chris Thompson 2009-06-10 08:51:16

5 réponses

Vous pouvez utiliser le ModifierKeys propriété statique sur la commande pour déterminer si la touche shift est maintenue.

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

Il s'agit d'un enum de style flag cependant donc, selon votre situation, vous voudrez peut-être faire des tests plus rigoureux.

notez aussi que ceci vérifiera si la touche Shift est maintenue au moment où vous vérifiez la valeur. Pas au moment où le menu ouvert a été initié. Peut-être pas une grande différence pour votre demande, mais c'est mérite d'être souligné.

64
répondu JaredPar 2015-08-03 13:15:25

Utilisez ceci pour détecter si la touche shift est pressée:

if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) 
38
répondu bobbyalex 2013-02-07 08:36:33

C'est en fait beaucoup plus simple que tout

            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 fait référence à PresentationCore et WindowsBase

13
répondu Stephen Punak 2014-02-28 19:10:50

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

if(Keyboard.Modifiers == ModifierKeys.Shift) {
    ...
}
3
répondu Héctor Espí Hernández 2013-10-25 08:00:42


En outre, je recommande son utilisation sur Keyboard.GetKeyStates parce que les utilisations ultérieures déclenchent et peuvent ne pas refléter l'état réel de la clé.

sachez aussi que cela ne se déclenchera que si le maj la touche modificateur est désactivée et rien d'autre:

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

Si vous voulez juste pour détecter si le maj touche de bas, qu'une autre touche de modificateur soit pressée ou non, utilisez celle-ci:

if((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
{ ... }
3
répondu FastJack 2017-06-14 10:18:37