2009-06-10 7 views
33

W mojej aplikacji C# chcę wyświetlić menu kontekstowe, ale chcę dodać specjalne opcje do menu, jeśli klawisz SHIFT jest przytrzymywany, gdy kontekst menu jest otwarte.C# - Wykrywanie, czy klawisz SHIFT jest przytrzymywany podczas otwierania menu kontekstowego

Używam obecnie interfejsu API GetKeyState do sprawdzania klawisza SHIFT. Działa dobrze na moim komputerze, ale użytkownicy z nie-angielskimi Windowsami mówią, że nie działa on dla nich wcale.

Przeczytałem również, że w Win32 API po otwarciu menu kontekstowego flaga wskazująca w menu powinna pokazywać EXTENDEDVERBS. W języku C# EventArgs dla zdarzenia nie zawiera (z tego, co mogę powiedzieć) właściwość wskazująca EXTENDEDVERBS lub jeśli klawisze modyfikujące są naciśnięte.

Oto kod używam teraz wewnątrz „Opening” wydarzenie:

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

Jeśli GetKeyState jest właściwy sposób to zrobić, jest moje kod poprawnie wykrywania klawisz SHIFT jest wciśnięty?

Odpowiedz

60

Za pomocą kontrolki ModifierKeys static property można określić, czy klawisz Shift jest przytrzymywany.

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

Jest to wyliczenie stylu flagi, więc w zależności od sytuacji możesz chcieć wykonać bardziej rygorystyczne testy.

Należy również pamiętać, że to sprawdzi, czy klawisz Shift jest przytrzymany w momencie sprawdzania wartości. Nie w momencie, kiedy zostało otwarte menu otwarte. To może nie być znacząca różnica dla twojej aplikacji, ale warto o tym pamiętać.

+0

Niestety, rodzicem ContextMenu w moim kodzie jest UserControl, a właściwość ModifierKeys nie jest dostępna dla UserContr ol lub dla obiektu ContextMenu. –

+0

@Chris - Jared mówi, że jest statyczny. Zaktualizowałem jego odpowiedź linkiem do msdn –

+0

Nie zauważyłem tego. Myślałem, że to była właściwość instancji. Wypróbuję to. –

37

Służy do wykrycia, jeśli klawisz Shift jest wciśnięty:

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

Zanim napisałem tę odpowiedź, Jared już ją opublikował. Przepraszamy za duplikat. – bobbyalex

+0

Chris ma rację. Właściwość powinna być dostępna, nawet jeśli używasz UserControl. – bobbyalex

+11

Sprawdza to, czy naciśnięto klawisz Shift, i jakie było pierwotne pytanie. Druga odpowiedź sprawdza, czy TYLKO naciśnięty jest klawisz Shift. – adzm

3

w Silverlight, przynajmniej w najnowszej wersji, należy użyć:

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

To rzeczywiście znacznie prostsze niż którykolwiek że

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

Tylko upewnij się, że Twój projekt odwołuje się do PresentationCore i WindowsBase

2

Keyboard.Modifiers działa również z rzeczywistymi projektami WPF!
Również polecam jej użycie ponad Keyboard.GetKeyStates, ponieważ później używa wyzwalania i może nie odzwierciedlać rzeczywistego stanu klucza.

także mieć świadomość, że to wywoła tylko jeśli shift key modyfikator jest w dół i nic więcej:

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

Jeśli chcesz tylko do wykrycia, jeśli przesunięcie klucz jest w dół, czy innego modyfikatora Klawisz jest wciśnięty, czy nie, użyj tego:

if((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift) 
{ ... } 
Powiązane problemy