web-dev-qa-db-fra.com

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 certaines zones de texte n'acceptent 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 dessus sans aucun problème. Mais quand j'essaie d'appuyer Ctrl+A J'entends seulement un "bling" semblable au bling que vous entendez si vous essayez d'effacer du texte d'une zone de texte vide (essayez-le avec la barre d'adresse de votre navigateur).

55
Patrik Lippojoki

Comme d’autres réponses, Application.EnableVisualStyles() doit être appelé. De même, le TextBox.ShortcutsEnabled doit être défini sur true. Mais si votre TextBox.Multiline est activé, alors  Ctrl+A  ne fonctionnera pas ( voir documentation MSDN ). Utiliser RichTextBox à la place permettra de résoudre le problème.

70
jltrem

Créez simplement un événement keydown pour la 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();
    }
}
32
Stack Man

Vous pouvez toujours remplacer les touches de commande de 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);
}
24
Charles380

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

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

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

3
user2032433

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

1
Amit

Jeter dans mes deux cents. Appeler cela sous pression est simplement une autre option.

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

Pas besoin de gérer WM_KEYDOWN! 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é.

Au lieu de cela, essayez 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 à cette commande Edit_Prc () à l'aide de WPA = SetWindowLong (...), où WPA est l'adresse de la procédure de fenêtre pour CallWindowProc (...).

J'ai découvert cela par expérience, après avoir constaté que toutes les réponses trouvées en ligne insistaient sur le traitement de WM_KEYDOWN, à l'aide de GetKeyState (), et aboutissaient avec un code plus gros qui ne parvenait pas à arrêter ce bip agaçant!

Bien que cette réponse ne traite pas de dotnet, dans de tels cas, il est généralement préférable d’aborder la question et de la résoudre plutôt que de chercher quelle version d’un système de code encapsuleur volumineux peut ou non le faire pour vous, en particulier si vous le souhaitez. éviter le risque de lutter contre les comportements inhérents.

0
user1418124