我怎样才能允许ctrl + a与WinForm中的TextBox?

我问这个问题已经问(甚至回答)在这里: 为什么一些文本框不接受控制+一个快捷方式来select所有默认

但是这个答案对我来说不起作用。 我有这个代码:

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

文本框出现了,我可以写上,我可以剪切,复制和粘贴文本没有任何问题。 但是,当我尝试按下Ctrl + A时 ,只听到一个类似于您试图从空文本框中删除文本(使用浏览器的地址栏进行试用)时听到的金光闪闪的“金光闪闪”。

像其他答案一样, Application.EnableVisualStyles()应该被调用。 此外, TextBox.ShortcutsEnabled应设置为true 。 但是, 如果您的TextBox.Multiline启用,则 Ctrl + A 将无法工作 ( 请参阅MSDN文档 )。 使用RichTextBox来解决这个问题。

只要为该TextBox创build一个keydown事件并包含以下代码:

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

您始终可以覆盖进程命令键以获得所需的结果

 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); } 

这也发生在我身上,我假设你移除了Application.EnableVisualStyles(); 从你的程序? 将它添加回Main()函数,一切都应该正常工作。

快速的回答是,如果你使用多行真正你必须显式调用全选。

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

文本框有一个方法SelectAll() ,并为我工作得很好。 (.net 4.5)

无需处理WM_KEYDOWN! 我知道这里的大多数例子(以及CodeProject和其他许多地方)都有这样的说法,但是它并不能解决无法处理的WM_CHAR时产生的嘟嘟声。

相反,试试这个:

 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); } 

请记住使用WPA = SetWindowLong(…)将EDIT控件inheritance到此Edit_Prc(),其中WPA是CallWindowProc(…)的窗口过程地址。

我发现通过实验发现,我在网上发现的所有答案都坚持使用GetKeyState()来处理WM_KEYDOWN,并以更大的代码来阻止这个恼人的嘟嘟声!

虽然这个答案不涉及dotnet,但在这种情况下,通常更好的做法是切换到解决scheme,而不是争论大代码包装系统的哪个版本可能会或可能不会为你做,特别是如果你想避免与内置行为作斗争的风险。

扔在我的两分钱。 在按键下调用这只是另一种select。

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