2009-06-10 17 views
33

En mi aplicación C# quiero mostrar un menú contextual, pero quiero agregar opciones especiales al menú si la tecla MAYÚS se mantiene presionada cuando el contexto el menú está abierto.C# - Detectando si se mantiene presionada la tecla al abrir un menú contextual

Actualmente estoy usando la API GetKeyState para comprobar la tecla MAYÚS. Funciona bien en mi computadora, pero los usuarios con Windows que no es inglés dicen que no funciona para ellos.

También leí que en la API de Win32 cuando se abre un menú contextual hay una bandera que indica que en el menú debe mostrar EXTENDEDVERBS. En C#, el EventArgs para el evento Opening no contiene (por lo que puedo decir) una propiedad que indique EXTENDEDVERBS o si se presionan las teclas modificadoras.

Aquí está el código que estoy usando ahora dentro del evento "Opening":

// 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 es la forma correcta de hacerlo, es mi código de detectar adecuadamente la tecla SHIFT ser presionado?

Respuesta

60

Puede usar el ModifierKeys static property en el control para determinar si se mantiene presionada la tecla Mayús.

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

Esta es una enumeración estilo de la bandera, aunque por lo que dependiendo de su situación es posible que desee hacer pruebas más rigurosas.

También tenga en cuenta que esto verificará si la tecla Shift se mantiene en el momento que verifica el valor. No es el momento cuando se inició el menú abierto. Esa puede no ser una diferencia significativa para su aplicación, pero vale la pena señalarlo.

+0

por desgracia, los padres del ContextMenu en mi código es un control de usuario y la propiedad ModifierKeys tampoco está disponible para el UserContr ol o para el objeto ContextMenu. –

+0

@Chris - Como Jared dice que es estático. Actualicé su respuesta con un enlace a msdn –

+0

. No lo noté. Estaba pensando que era una propiedad de instancia. Lo probaré. –

37

Utilice esta opción para detectar si se pulsa la tecla de mayúsculas:

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

En el momento en que escribí esta respuesta, Jared ya la había publicado. Perdón por el duplicado. – bobbyalex

+0

Chris tiene razón. La propiedad debe estar disponible para usted aunque esté usando un UserControl. – bobbyalex

+11

Esto comprueba si se presiona la tecla Mayús, que es lo que quería la pregunta original. La otra respuesta verifica si SÓLO se presiona la tecla Shift. – adzm

3

En Silverlight, al menos en las versiones más recientes, debe utilizar:

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

En realidad es mucho más simple que cualquiera de esas

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

Sólo asegúrese de que el proyecto hace referencia a PresentationCore y WindowsBase

2

Keyboard.Modifiers ¡también funciona con proyectos reales de WPF!
También recomendaría su uso sobre Keyboard.GetKeyStates porque el último usa activación y puede no reflejar el estado real de la tecla.

También tenga en cuenta que esto sólo se disparará si la clave modificador cambio es hacia abajo y nada más:

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

Si lo que desea es detectar si la clave cambio se ha reducido, si otro modificador se pulsa la tecla o no, utilice la siguiente:

if((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift) 
{ ... } 
Cuestiones relacionadas