Comment puis-je autoriser ctrl + a avec TextBox dans winform?

Je pose la question déjà posée (et même répondue) ici: Pourquoi certains zones de texte n’acceptent-elles pas Control + Un raccourci pour tout sélectionner par défaut

Mais cette réponse ne fonctionne pas pour moi. J’ai ce code:

public class LoginForm : Form { private TextBox tbUsername; public LoginForm() { tbUsername = new TextBox(); tbUsername.ShortcutsEnabled = true; tbUsername.Multiline = false; Controls.Add(tbUsername); } } 

La zone de texte apparaît, je peux écrire dessus, je peux couper, copier et coller du texte sans aucun problème. Mais lorsque j’essaie d’appuyer sur Ctrl + A, je n’entends qu’un “bling” similaire au bling que vous entendez si vous essayez d’effacer du texte d’une zone de texte vide (essayez-la avec la barre d’adresse de votre navigateur).

Comme d’autres réponses l’indiquent, Application.EnableVisualStyles() doit être appelée. Le TextBox.ShortcutsEnabled doit également être défini sur true . Mais si votre TextBox.Multiline est activée, alors Ctrl + A ne fonctionnera pas ( voir la documentation MSDN ). À la place, RichTextBox contournera le problème.

Créez simplement un événement keydown pour cette zone de texte en question et incluez ce code:

 private void tbUsername_KeyDown(object sender, KeyEventArgs e) { if (e.Control && e.KeyCode == Keys.A) { if (sender != null) ((TextBox)sender).SelectAll(); } } 

Vous pouvez toujours remplacer les touches de commande du processus pour obtenir le résultat souhaité

 protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { const int WM_KEYDOWN = 0x100; var keyCode = (Keys) (msg.WParam.ToInt32() & Convert.ToInt32(Keys.KeyCode)); if ((msg.Msg == WM_KEYDOWN && keyCode == Keys.A) && (ModifierKeys == Keys.Control) && tbUsername.Focused) { tbUsername.SelectAll(); return true; } return base.ProcessCmdKey(ref msg, keyData); } 

Cela m’est arrivé une fois aussi, je suppose que vous avez supprimé l’appel à Application.EnableVisualStyles(); de votre programme? Ajoutez-le à la fonction Main() et tout devrait fonctionner correctement.

La réponse rapide est que si vous utilisez multiline true, vous devez appeler explicitement select all.

 private void tbUsername_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.A && e.Control) { tbUsername.SelectAll(); } } 

Textbox a une méthode SelectAll() et a bien fonctionné pour moi. (.net 4.5)

Pas besoin de gérer WM_KEYDOWN! Je sais que la plupart des exemples ici (ainsi que CodeProject et de nombreux autres endroits) disent tous qu’il y en a, mais cela ne résout pas le bip qui se produit chaque fois qu’un WM_CHAR survient et n’est pas géré.

Essayez plutôt ceci:

 LRESULT CALLBACK Edit_Prc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){ if(msg==WM_CHAR&&wParam==1){SendMessage(hwnd,EM_SETSEL,0,-1); return 1;} else return CallWindowProc((void*)WPA,hwnd,msg,wParam,lParam); } 

N’oubliez pas de sous-classer le contrôle EDIT dans cette Edit_Prc () en utilisant WPA = SetWindowLong (…) où WPA est l’adresse de la procédure de fenêtre pour CallWindowProc (…)

J’ai compris cela par expérience, après avoir constaté que toutes les réponses que j’ai trouvées en ligne insistaient sur la gestion de WM_KEYDOWN, en utilisant GetKeyState (), et que le code plus gros ne parvenait pas à arrêter ce bip!

Bien que cette réponse ne traite pas de dotnet, dans de tels cas, il est généralement préférable de réduire le temps passé à résoudre le problème plutôt que de se demander quelle version d’un grand système d’encapsulation de code peut ou ne peut pas le faire. pour éviter le risque de lutter contre un comportement intégré.

Jeter dans mes deux cents. L’appel de cette touche sous pression est une autre option.

 private void TxtBox_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == '\x1') { TxtBox.SelectAll(); e.Handled = true; } }