60

我在这里问已经问过(甚至回答过)的问题: Why are some textboxes not accepting Control + A shortcut to select all by default

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

public class LoginForm : Form
{
    private TextBox tbUsername;

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

文本框出现,我可以在上面写字,我可以在上面剪切、复制和粘贴文本,没有任何问题。但是,当我尝试按Ctrl+时,A我只会听到类似于您尝试从空文本框中删除文本时听到的“bling”(使用浏览器的地址栏尝试)。

4

9 回答 9

76

就像其他答案表明的那样,Application.EnableVisualStyles()应该调用。也TextBox.ShortcutsEnabled应该设置为true. 但是如果你TextBox.Multiline启用了,那么 Ctrl+A 将不起作用请参阅 MSDN 文档)。使用RichTextBox代替将解决问题。

于 2015-04-30T01:09:05.760 回答
42

只需为有问题的 TextBox 创建一个 keydown 事件并包含以下代码:

private void tbUsername_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control && e.KeyCode == Keys.A)
    {
        if (sender != null)
            ((TextBox)sender).SelectAll();
    }
}
于 2015-01-01T07:41:16.277 回答
24

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

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);
}
于 2013-04-25T12:30:07.877 回答
6

快速回答是,如果您使用 multiline true ,则必须显式调用全选。

private void tbUsername_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.A && e.Control)
    {
        tbUsername.SelectAll();
    }
}
于 2016-08-18T21:50:09.247 回答
3

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

于 2013-04-25T18:35:51.537 回答
1

文本框有一种方法SelectAll(),对我来说效果很好。(.net 4.5)

于 2014-12-08T20:40:18.133 回答
0

无需处理 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 控件子类化到此 Edit_Prc() ,其中 WPA 是 CallWindowProc(...) 的窗口过程地址

我通过实验发现了这一点,在发现我在网上找到的所有答案都坚持使用 GetKeyState() 处理 WM_KEYDOWN 后,最终得到了更大的代码,无法阻止那恼人的哔哔声!

虽然这个答案不涉及 dotnet,但在这种情况下,通常最好切入正题并解决它,而不是为大型代码包装系统的哪个版本可能会或可能不会为你做这件事而苦恼,特别是如果你想要以避免与固有行为作斗争的风险。

于 2014-08-18T03:38:51.020 回答
0

投入我的两分钱。在按键下调用它只是另一种选择。

private void TxtBox_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == '\x1')
    {
        TxtBox.SelectAll();
        e.Handled = true;
    }
}
于 2016-09-07T07:27:34.667 回答
0

这是我的代码,它工作正常

private void mainSimPlus_KeyDown(object sender, KeyEventArgs e)
            {
                e.Handled = true;
                if (e.Control == true && e.KeyCode == Keys.A)
                {
                    if (SelectAllTextBox(txt1))
                        return;
                    if (SelectAllTextBox(txt2))
                        return;
                }
            }
            private bool SelectAllTextBox(TextBox txt)
            {
                if (txt.Focused)
                {
                    txt.SelectAll();
                    return true;
                }
                else
                    return false;
            }
于 2020-06-01T08:17:39.543 回答