2011-01-16 25 views
32

Tengo un formulario en el que el usuario puede hacer doble clic con el mouse y hará algo. Ahora quiero saber si el usuario también está presionando la tecla Ctrl Ctrl cuando el usuario hace doble clic en el formulario.Pruebe si la tecla Ctrl está presionada con C#

¿Cómo puedo saber si el usuario está presionando la tecla Ctrl Ctrl?

+0

http://stackoverflow.com/questions/973721/c-detecting-if-the-shift-key-is-held-when-opening-a-context- menú Esto es para la tecla Shift. Pero el concepto es el mismo – LiamB

+0

IMO, es un concepto complicado cuando tenemos elementos predefinidos para ayudarnos aquí, sin recurrir a 'números mágicos' menos sostenibles. –

+0

@GrantThomas Estoy seguro de que se estaba refiriendo a las respuestas en ese hilo, que proporcionan exactamente lo que proporcionó anteriormente además de ser una tecla modificadora diferente. – Dan

Respuesta

67

El uso de .NET 4 se puede utilizar algo tan simple como:

private void Control_DoubleClick(object sender, EventArgs e) 
    { 
     if (ModifierKeys.HasFlag(Keys.Control)) 
     { 
      MessageBox.Show("Ctrl is pressed!"); 
     } 
    } 

Si usted no está utilizando .NET 4, entonces la disponibilidad de Enum.HasFlag se revoca, pero para lograr el mismo resultado en las versiones anteriores :

private void CustomFormControl_DoubleClick(object sender, EventArgs e) 
    { 
     if ((ModifierKeys & Keys.Control) == Keys.Control) 
     { 
      MessageBox.Show("Ctrl is pressed!"); 
     } 
    } 
+1

Ahhhh .... Todavía estoy usando framework 2.0. Tal vez es hora de actualizar :) –

+0

Tal vez, pero si eso no es posible, entonces mi segundo ejemplo todavía debería hacer el truco. –

+0

Enum.HasFlag es aproximadamente 16 veces más lento que utilizando la operación bit a bit. [stackoverflow.com/questions/7368652](http://stackoverflow.com/questions/7368652/what-is-it-that-makes-enum-hasflag-so-slow) – NET3

4

Incluso esto también

private void Control_MouseDoubleClick(object sender, MouseEventArgs e) 
    { 
     if (ModifierKeys == Keys.Control) 
      MessageBox.Show("with CTRL"); 
    } 
+0

Perfecto. Gracias. –

17

simplemente para la corrección ... ModifierKeys es una propiedad estática de Control, para que pueda probar que aun cuando no se encuentre directamente en un controlador de eventos:

public static bool IsControlDown() 
{ 
    return (Control.ModifierKeys & Keys.Control) == Keys.Control; 
} 
0

La misma soneone dijo anteriormente, pero comparado con tan diferente de cero, lo que debería ser un poco más rápido y utilizar menos instrucciones en la mayoría de arquitecturas:

public static bool IsControlDown() 
{ 
    return (Control.ModifierKeys & Keys.Control) != 0; 
} 
Cuestiones relacionadas