2009-06-10 15 views
33

Nella mia applicazione C# voglio visualizzare un menu di scelta rapida, ma voglio aggiungere opzioni speciali al menu se il tasto SHIFT viene tenuto premuto quando il contesto il menu è aperto.C# - Rilevamento se il tasto MAIUSC è trattenuto quando si apre un menu di contesto

Attualmente sto usando l'API GetKeyState per controllare il tasto MAIUSC. Funziona bene sul mio computer ma gli utenti con Windows non inglese dicono che non funziona affatto per loro.

Ho anche letto che nell'API Win32 quando viene aperto un menu di scelta rapida c'è un indicatore che nel menu indica deve mostrare EXTENDEDVERBS. In C# EventArgs per l'evento Opening non contiene (da quello che posso dire) una proprietà che indica EXTENDEDVERBS o se vengono premuti i tasti di modifica.

Ecco il codice che sto usando ora all'interno del "Opening" evento:

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

Se GetKeyState è il modo giusto di farlo, è il mio codice rilevare correttamente il tasto SHIFT viene premuto?

risposta

60

È possibile utilizzare il ModifierKeys static property sul controllo per determinare se il tasto Maiusc viene trattenuto.

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

Questo è un enumer di stile bandiera, quindi, in base alla situazione, è possibile eseguire test più rigorosi.

Si noti inoltre che questo verificherà se il tasto Maiusc è trattenuto nel momento in cui si controlla il valore. Non il momento in cui è stato avviato il menu aperto. Potrebbe non essere una differenza significativa per la tua applicazione, ma vale la pena notare.

+0

Purtroppo, padre del ContextMenu nel mio codice è un controllo utente e la proprietà ModifierKeys non è disponibile sia per l'UserContr ol o per l'oggetto ContextMenu. –

+0

@Chris - Come dice Jared, è statico. Ho aggiornato la sua risposta con un collegamento a msdn –

+0

non l'ho notato. Stavo pensando che fosse una proprietà di istanza. Lo proverò. –

37

Utilizzare questo per rilevare se viene premuto il tasto Shift:

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

Nel momento in cui ho digitato questa risposta, Jared l'aveva già pubblicato. Ci scusiamo per il duplicato. – bobbyalex

+0

Chris ha ragione. La proprietà dovrebbe essere disponibile anche se si utilizza un UserControl. – bobbyalex

+11

Controlla se è stato premuto il tasto Maiusc, che è la domanda originale desiderata. L'altra risposta controlla se viene premuto SOLO il tasto Maiusc. – adzm

3

in Silverlight, almeno nelle versioni più recenti, è necessario utilizzare:

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

In realtà è molto più semplice di nulla di tutto ciò

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

Basta assicurarsi che il progetto faccia riferimento a PresentationCore e WindowsBase

2

Keyboard.Modifiers funziona anche con progetti WPF effettivi!
Inoltre, consiglierei di utilizzarlo su Keyboard.GetKeyStates perché il successivo utilizza l'attivazione e potrebbe non riflettere lo stato della chiave reale.

essere consapevoli che questo attiverà solo se la chiave modificatore di spostamento è verso il basso e nient'altro anche:

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

Se si desidera solo per rilevare se il chiave spostamento è verso il basso, se un altro modificatore tasto viene premuto o no, utilizzare questo:

if((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift) 
{ ... } 
Problemi correlati