如何在winform中允许带有TextBox的ctrl + a?

Pat*_*oki 55 c# textbox keyboard-shortcuts winforms

我问这里已经问过(甚至回答过)的问题: 为什么有些文本框不接受Control +默认选择all的快捷方式

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

public class LoginForm : Form
{
    private TextBox tbUsername;

    public LoginForm()
    {
        tbUsername = new TextBox();
        tbUsername.ShortcutsEnabled = true;
        tbUsername.Multiline = false;
        Controls.Add(tbUsername);
    }
}
Run Code Online (Sandbox Code Playgroud)

文本框显示,我可以在上面写,我可以剪切,复制和粘贴文本,没有任何问题.但是,当我尝试按Ctrl+时,A我只会听到类似于你试图从空文本框中删除文本时所听到的"bling"(使用浏览器的地址栏尝试).

jlt*_*rem 72

像其他答案所示,Application.EnableVisualStyles()应该被称为.也TextBox.ShortcutsEnabled应该设置为true.但是如果TextBox.Multiline启用了,那么 Ctrl + A 将无效(请参阅MSDN文档).RichTextBox相反,使用将解决问题.

  • 关于MultiLine的部分必须讨论默认行为.把'if(e.Control && e.KeyCode == Keys.A)Textbox.SelectAll();`放在KeyDown事件处理程序中对我来说很好. (22认同)
  • 已在.NET 4.6.1中修复 (10认同)
  • 显然,在4.7中再次破碎. (5认同)
  • @Dan是正确的,如果您使用的是MultiLine并且仍然需要标准文本框,那么您必须解决这个问题.MS的一个奇怪的设计决定(读作:bug). (4认同)

Sta*_*Man 37

只需为该TextBox创建一个keydown事件,并包含以下代码:

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


Cha*_*380 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 这是"Application.EnableVisualStyles();"所有那些快速而肮脏的解决方案.不适用.对我来说非常有用.谢谢. (2认同)

Nic*_*rts 5

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

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