web-dev-qa-db-fra.com

Pourquoi certaines zones de texte n'acceptent-elles pas Contrôle + Un raccourci pour tout sélectionner par défaut

J'ai trouvé quelques zones de texte ici et là dans mon programme qui accepte le raccourci Contrôle + A pour sélectionner le texte entier "par défaut" avec "pas de codage".

Je ne sais pas quelles informations supplémentaires je dois donner ici pour l'activer pour chacune d'entre elles, car je ne trouve absolument aucune différence entre ces zones de texte. Ce sont toutes de simples zones de texte glissées et déposées.

Remarque: je ne parle pas de ce morceau de code:

if (e.Control && e.KeyCode == Keys.A)
{
    textBox1.SelectAll();
}

Je souhaite une sélection par défaut ... ou existe-t-il de toute façon de modifier la propriété de la zone de texte afin que les zones de texte acceptent tous les raccourcis Windows par défaut?

Tout le reste (Control + Z, Control + X, Control + C, Control + V) fonctionne par défaut! Pourquoi pas Control + A?

Mise à jour: Les zones de texte qui ont accepté Ctrl+A par défaut étaient zones de texte masquées , pas celles normales. Et à ce stade, j'étais avec .NET 2.0. Mais je suppose le problème d'origine était autre chose, comme je peux le voir Ctrl+A fonctionne correctement par défaut dans le code .NET 2.0.

42
nawfal

Vous recherchez peut-être la propriété ShortcutsEnabled . Le définir sur true permettrait à vos zones de texte d'implémenter le Ctrl+A raccourci (entre autres). De la documentation:

Utilisez la propriété ShortcutsEnabled pour activer ou désactiver les combinaisons de touches de raccourci suivantes:

  • CTRL+Z

  • CTRL+E

  • CTRL+C

  • CTRL+Y

  • CTRL+X

  • CTRL+BACKSPACE

  • CTRL+V

  • CTRL+DELETE

  • CTRL+A

  • SHIFT+DELETE

  • CTRL+L

  • SHIFT+INSERT

  • CTRL+R

Cependant, le documentation déclare:

Le contrôle TextBox ne prend pas en charge le CTRL+A touche de raccourci lorsque la valeur de la propriété Multiline est vraie.

Vous devrez probablement utiliser une autre sous-classe de TextBoxBase, telle que RichTextBox , pour que cela fonctionne.

66

En effet, CTRL + A ne fonctionnera que si vous ajoutez quelque chose comme ceci:

  private void textBox1_KeyDown(object sender, KeyEventArgs e)
  {
      if (e.Control && (e.KeyCode == Keys.A))
      {
          if (sender != null)
               ((TextBox)sender).SelectAll();
          e.Handled = true;
      }
  }
25
Junior M

Cette réponse a fonctionné pour moi dans une question similaire (qui n'est pas marquée comme acceptée)

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) 
        && txtYourTextBox.Focused)
    {
        txtYourTextBox.SelectAll();
        return true;
    }            
    return base.ProcessCmdKey(ref msg, keyData);
}

Message d'origine: Comment puis-je autoriser ctrl + a avec TextBox dans winform?

4
TheJonz

Assurez-vous que Application.EnableVisualStyles (); n'est pas commenté dans le vide statique Main ()

Cela peut désactiver Ctrl + A

2
Jon Dosmann

Cette question veut une réponse qui ne peut pas être donnée sous forme d'évitement de code, car l'API Win32 au cœur des autres méthodes ne le permet pas. Si d'autres méthodes le permettent, elles écrivent simplement le code pour vous. :)

La vraie question est donc: quelle est la façon la plus petite et la plus soignée de le faire? Cela a fonctionné pour moi:

Tout d'abord, il n'est pas nécessaire de gérer WM_KEYDOWN! Et pas besoin non plus de tester la touche Ctrl. Je sais que la plupart des exemples ici (et CodeProject et de nombreux autres endroits) disent tous qu'il y en a un, mais cela ne résout pas le bip qui se produit chaque fois qu'un WM_CHAR survient qui n'est pas géré.

Essayez plutôt de gérer WM_CHAR et de faire la sélection Ctrl + A:

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 ce Edit_Prc () en utilisant WPA = SetWindowLong (...) où WPA est l'adresse de procédure de fenêtre pour CallWindowProc (...)

1
user1418124