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?
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é.
Utilisez ceci pour détecter si la touche shift est pressée:
if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift)
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
Dans silverlight, au moins dans les dernières versions, vous devez utiliser:
if(Keyboard.Modifiers == ModifierKeys.Shift) {
...
}
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)
{ ... }