2010-02-09 4 views
2

J'ai un contrôle avec les événements KeyDown et KeyUp comme indiqué ci-dessous. Le problème que j'ai est que 'x' est VRAI dans KeyDown mais toujours FALSE dans KeyUp. J'essaie de détecter la touche Alt (comme vous l'avez deviné).Problèmes de détection de la touche Alt sur l'événement Control.KeyUp

Y a-t-il une gottcha que je ne connais pas? Je veux dire, quand j'appuie sur Alt, il le détecte correctement, mais sur keyup c'est faux.

Toutes les suggestions/idées

Merci

private void MyControl_KeyDown(object sender, KeyEventArgs e) 
    { 
     bool x; 
     x = ((int) (e.KeyData & Keys.Alt) != 0); 
     x = (e.KeyData & Keys.Alt) == Keys.Alt; 
     x = e.Alt; 
    } 
    private void MyControl_KeyUp(object sender, KeyEventArgs e) 
    { 
     bool x; 
     x = ((int) (e.KeyData & Keys.Alt) != 0); 
     x = (e.KeyData & Keys.Alt) == Keys.Alt; 
     x = e.Alt; 
    } 

Répondre

5

Êtes-vous essayer de détecter un événement Alt + [lettre]? Est-ce donc, essayez ceci:

 private void YourControl_KeyDown(object sender, KeyEventArgs e) 
     { 
      if((e.Alt) & (e.KeyCode == Keys.X)) 
      { 
      MessageBox.Show("Alt-X pressed"); 
      } 
     } 

Pour seulement Alt, essayez ceci:

private void YourControl_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Menu) 
     { 
      //YourCode 
      e.Handled = true; 
     } 
    } 

    private void YourControl_KeyUp(object sender, KeyEventArgs e) 
    { 
     if (e.KeyData == Keys.Menu) 
     { 
      //YourCode 
      e.Handled = true; 
     } 
    } 
+0

Non, j'essaie juste de détecter la touche Alt c'est tout, pas de combinaison. – ababeel

+1

J'ai ajouté du code pour juste Alt dans ma réponse ci-dessus. Parce que Alt sert à afficher les menus, vous devez faire un e.Handled = true, à moins que vous ne vouliez capturer que 50% des presses Alt. La vérification de KeyUp est légèrement différente de KeyDown (voir ci-dessus). Est-ce que ça marche pour toi? – bluecoder

+0

Merci cela a fonctionné. – ababeel

1

J'espère que vous n'êtes pas mettre juste une variable membre bool dans votre classe en réponse à l'Alt touche étant pressée.

Si vous voulez savoir si la touche Alt est enfoncée pendant l'exécution du code en réponse à d'autres événements (par exemple, les événements de souris), utilisez la propriété Control.ModifierKeys car elle est beaucoup plus fiable. Cela signifie également que vous n'avez pas de variable membre redondante.

Si vous essayez réellement de détecter si l'utilisateur n'a appuyé que sur une touche de modification, la solution de @ bluecoder est probablement ce que vous voulez.

1

Si vous voulez détecter une touche réelle (Alt ou toute autre touche), vous pouvez utiliser ce code. Ce code fonctionne dans le KeyUp, KeyDown et d'autres événements clés

private void YourControl_KeyDown(object sender, KeyEventArgs e) 
{ 
    Key _key = e.Key != Key.System ? e.Key : e.SystemKey; 
    // _key is your real pressed key 
} 
Questions connexes