2011-01-16 17 views
32

Mam formularz, który użytkownik może dwukrotnie kliknąć myszą, a to coś zrobi. Teraz chcę wiedzieć, czy użytkownik trzyma również klucz w dół, gdy użytkownik kliknie dwukrotnie na formularzu.Sprawdź, czy klawisz Ctrl nie działa, używając C#

Jak sprawdzić, czy użytkownik trzyma klucz Ctrl w dół?

+0

http://stackoverflow.com/questions/973721/c-detecting-if-the-shift-key-is-held-when-opening-a-context- menu Jest to klucz Shift. Ale koncepcja jest taka sama. – LiamB

+0

IMO, To niechlujna koncepcja, gdy mamy wstępnie zdefiniowane elementy, które pomogą nam tutaj, bez uciekania się do mniej sprawnych "magicznych liczb". –

+0

@GrantThomas Jestem pewien, że odnosił się do odpowiedzi w tym wątku, które zapewniają dokładnie to, co podałeś powyżej, poza tym, że jest to inny klawisz modyfikujący. – Dan

Odpowiedz

67

Korzystanie .NET 4 można użyć coś tak prostego jak:

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

Jeśli nie używasz .NET 4, a następnie dostępność Enum.HasFlag jest odwołane, ale aby osiągnąć ten sam rezultat w poprzednich wersjach :

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

Ahhhh .... Nadal używam framework 2.0. Może czas uaktualnić :) –

+0

Może, ale jeśli to nie jest możliwe, to mój drugi przykład nadal powinien załatwić sprawę. –

+0

Enum.HasFlag jest około 16 razy wolniejszy niż przy użyciu operacji bitowej. [stackoverflow.com/questions/7368652](http://stackoverflow.com/questions/7368652/what-is-it-that-makes-enum-hasflag-so-slow) – NET3

4

Nawet to również

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

Idealny. Dzięki. –

17

Tylko dla kompletności ... ModifierKeys jest statyczną własnością Control, dzięki czemu można przetestować go, nawet jeśli nie są bezpośrednio w obsługi zdarzeń:

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

To samo soneone wspomnianej powyżej, ale porównując tak różne od zera, co powinno być trochę szybciej i zużywają mniej instrukcji na większości architektur:

public static bool IsControlDown() 
{ 
    return (Control.ModifierKeys & Keys.Control) != 0; 
} 
Powiązane problemy