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

时间:2013-04-24 16:59:06

标签: c# winforms textbox keyboard-shortcuts

我问这里已经问过(甚至回答过)的问题: 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”(尝试它)使用浏览器的地址栏。)

9 个答案:

答案 0 :(得分:70)

与其他答案一样,应该调用Application.EnableVisualStyles()。此外,TextBox.ShortcutsEnabled应设置为true。但如果您的TextBox.Multiline已启用,那么 Ctrl + A 将无效({{3} })。使用RichTextBox代替将解决问题。

答案 1 :(得分:34)

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

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

答案 2 :(得分: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);
}

答案 3 :(得分:5)

快速回答是,如果您使用多行真,则必须明确调用全选。

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

答案 4 :(得分:3)

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

答案 5 :(得分:1)

Textbox有一个方法SelectAll(),对我来说效果很好。 (.net 4.5)

答案 6 :(得分: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,但在这种情况下,通常最好切入追逐并解决它,而不是痛苦地考虑哪个版本的大型代码封装系统可能会或可能不会为你做,特别是如果你想避免与内在行为作斗争的风险。

答案 7 :(得分:0)

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

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

答案 8 :(得分: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;
            }