2009-06-10 3 views
33

In meiner C# -Anwendung möchte ich ein Kontextmenü anzeigen, aber dem Menü spezielle Optionen hinzufügen, wenn die UMSCHALTTASTE während des Kontexts gedrückt gehalten wird Menü ist geöffnet.C# - Ermitteln, ob die UMSCHALTTASTE beim Öffnen eines Kontextmenüs gehalten wird

Ich verwende derzeit die GetKeyState API, um nach der UMSCHALTTASTE zu suchen. Es funktioniert gut auf meinem Computer, aber Benutzer mit nicht-Englisch Windows sagen, es funktioniert überhaupt nicht für sie.

Ich lese auch, dass in der Win32-API, wenn ein Kontextmenü geöffnet ist, gibt es ein Flag, das im Menü angezeigt werden soll EXTENDEDVERBS. In C# das EventArgs für dasEreignis enthält (was ich sagen kann) keine Eigenschaft, die EXTENDEDVERBS anzeigt, oder wenn irgendwelche Modifizierertasten gedrückt werden.

Hier ist der Code, den ich jetzt in der „Opening“ -Ereignis bin mit:

// 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); 
} 

Wenn GetKeyState der richtige Weg ist, es zu tun, ist mein Code richtig die SHIFT-Taste Erkennung gedrückt wird?

Antwort

60

Sie können die ModifierKeys static property on Steuerung verwenden, um festzustellen, ob die Umschalttaste gedrückt wird.

Dies ist eine Flag-Stil-Enum aber obwohl abhängig von Ihrer Situation Sie möchten, mehr strenge Tests zu tun.

Beachten Sie auch, dass hier geprüft wird, ob die Umschalttaste in dem Moment gedrückt wird, in dem Sie den Wert überprüfen. Nicht der Moment, als das Menü geöffnet wurde. Das ist vielleicht kein signifikanter Unterschied für Ihre Bewerbung, aber es ist erwähnenswert.

+0

Leider der Eltern ContextMenu in meinem Code ist ein Usercontrol und die ModifierKeys Eigenschaft ist nicht verfügbar, entweder für die UserContr ol oder für das ContextMenu-Objekt. –

+0

@Chris - Wie Jared sagt, es ist statisch. Ich aktualisierte seine Antwort mit einem Link zu msdn –

+0

Ich habe das nicht bemerkt. Ich dachte, dass es eine Instanzeigenschaft ist. Ich werde es ausprobieren. –

37

verwenden, um festzustellen, ob die Shift-Taste gedrückt wird:

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

Zu der Zeit, als ich diese Antwort eintippte, hatte Jared es bereits gepostet. Entschuldigung für das Duplikat. – bobbyalex

+0

Chris hat Recht. Die Eigenschaft sollte für Sie verfügbar sein, obwohl Sie ein Benutzersteuerelement verwenden. – bobbyalex

+11

Dies prüft, ob die Umschalttaste gedrückt wird, was die ursprüngliche Frage war. Die andere Antwort prüft, ob NUR die Umschalttaste gedrückt wird. – adzm

3

in Silverlight, zumindest in aktuellen Versionen, müssen Sie verwenden:

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

Es ist eigentlich viel einfacher als alle, dass

  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 */ 
      } 

So stellen Sie sicher, dass Ihr Projekt verweist PresentationCore und Windows

2

Keyboard.Modifiers funktioniert auch mit tatsächlichen WPF-Projekten!
Auch ich würde empfehlen, es über Keyboard.GetKeyStates zu verwenden, weil das spätere Auslösen verwendet und nicht den tatsächlichen Schlüsselzustand widerspiegelt.

auch darüber im Klaren sein, dass dies nur ausgelöst wird, wenn die Verschiebung Sondertaste gedrückt und nichts anderes:

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

Wenn Sie nur erkennen wollen, wenn die Verschiebung-Taste gedrückt ist, ob ein anderes Modifikator Taste gedrückt wird oder nicht, verwenden Sie diese ein:

if((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift) 
{ ... } 
Verwandte Themen