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).
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.
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();
}
}
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);
}
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();
}
}
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.
Textbox a une méthode SelectAll()
et a bien fonctionné pour moi. (.net 4.5)
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;
}
}
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.