2009-10-30 3 views
10

Malgré que je travaille avec C# (Windows Forms) pendant des années, je suis avoir un cerveau échec moment, et ne peut pas pour la vie de me comprendre comment attraper un utilisateur en tapant Ctrl + C dans une zone de texte.Attraper Ctrl + C dans une zone de texte

Mon application est essentiellement une application de terminal, et je veux Ctrl +C pour envoyer un (byte)3 à un port série, plutôt que d'être le raccourci pour le Presse-papiers Copier.

J'ai défini la propriété de raccourcis enabled sur false dans la zone de texte. Pourtant, lorsque l'utilisateur frappe Ctrl + C, l'événement de frappe ne se déclenche pas.

Si je surprends keydown, l'événement se déclenche lorsque l'utilisateur appuie sur les touches Ctrl (qui est, avant qu'ils ne touchent la clé C).

C'est probablement quelque chose de bêtement que j'ai manqué.

Répondre

32

Allez-y et utiliser l'événement KeyDown, mais que l'enregistrement des événements pour les deuxCtrl et C, comme ceci:

if (e.Control && e.KeyCode == Keys.C) { 
    //... 
    e.SuppressKeyPress = true; 
} 

En outre, pour éviter le traitement de la combinaison de touches par la zone de texte sous-jacent , définissez la propriété SuppressKeyPress sur true comme indiqué.

+0

acceptée car elle était la première réponse de travail. Merci beaucoup. - Je l'ai finalement compris - voir ma propre réponse. – Bryan

+0

Je sais, ça fait un moment, mais pour ceux qui vont le trouver dans le futur: Shift-Insert est toujours géré, donc vous devez ajouter (e.Shift && e.KeyCode == Keys.Insert) la validation. Aussi l'utilisateur peut toujours cliquer avec le bouton droit sur le champ et sélectionner Coller ... Donc pas 100% de preuve. – trailmax

1

Essayez les opérations suivantes: capturez la flèche vers le haut et flèche vers le bas événements. Lorsque vous détectez flèche vers le bas pour CTRL, définissez un indicateur; lorsque vous détectez flèche vers le haut, réinitialisez le drapeau. Si vous détectez la touche C alors que le drapeau est activé, vous avez Ctrl + C.

Modifier. Ouch ... La réponse de Jay est définitivement meilleure. :-)

6

événements clés se produisent dans l'ordre suivant:

  1. KeyDown
  2. KeyPress
  3. KeyUp

L'événement KeyPress n'est pas soulevée par les touches de noncharacter; cependant, les clés non-caractère soulèvent les événements KeyDown et KeyUp. Le contrôle est une clé non spécifique.

Vous pouvez vérifier avec cette ligne de code: if (e.KeyData == (Keys.Control | Keys.C))

3

D'oh! Je l'ai juste compris. Sur les trois événements possibles, celui que je n'ai pas essayé est celui dont j'avais besoin!L'événement KeyUp est l'importante:

private void txtConsole_KeyUp(object sender, KeyEventArgs e) 
{ 
    if (e.KeyData == (Keys.C | Keys.Control)) 
    { 
     _consolePort.Write(new byte[] { 3 }, 0, 1); 
     e.Handled = true; 
    } 
} 
+1

Eh bien, vous m'avez tous battu. KeyDown ne fonctionnait pas pour moi, car j'utilisais des points de rupture pour attraper les événements. Cela a bien fonctionné sur KeyUp, d'où la raison pour laquelle je me suis arrêté sur cet événement. – Bryan

5

J'ai eu un problème attraper Ctrl +C sur un TextBox par KeyDown. Je n'ai obtenu Control clé lorsque les deux Control et C ont été pressés. La solution utilisait PreviewKeyDown:

private void OnLoad() 
{ 
    textBox.PreviewKeyDown += OnPreviewKeyDown; 
    textBox.KeyDown += OnKeyDown; 
} 

private void OnPreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
{ 
    if (e.Control) 
    { 
     e.IsInputKey = true; 
    } 
} 

private void OnKeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Control && e.KeyCode == Keys.C) { 
     textBox.Copy(); 
    } 
} 
+0

Pas vrai, la capture d'événement KeyUp est la solution correcte. – TarmoPikaro

1

Je ne sais pas si c'est parce que certains changements dans la version plus récente ou parce que je suis en train de l'utiliser sur ListBox, mais il n'y a pas e.Control dans KeyEventArgs e que je reçois de KeyDown.

je devais travailler autour de la solution, je suis venu avec cette (ce n'est pas la plus jolie, mais il fonctionne très bien):

private List<Key> KeyBuff = new List<Key>(); 

private void ListBox_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (!KeyBuff.Exists(k => k == e.Key)) 
     KeyBuff.Add(e.Key); 

    if (KeyBuff.Exists(k => k == Key.LeftCtrl || k == Key.RightCtrl) && 
     KeyBuff.Exists(k => k == Key.C)) 
    { 
     // Desired detection 
     Clipboard.SetText(SelectedText); 
    } 
} 

private void ListBox_KeyUp(object sender, KeyEventArgs e) 
{ 
    KeyBuff.Clear(); 
}