我怎样才能让CTRL + A在文本框的WinForm?(How can I allow ctrl+a

2019-09-01 02:19发布

我问这个问题已经问过(甚至回答)这里: 为什么有些文本框不接受控制+ A快捷键来选择所有默认

但是这个答案并不为我工作。 我有这样的代码:

public class LoginForm : Form
{
    private TextBox tbUsername;

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

文本框显示了,我可以写在上面,我可以剪切,就可以复制和粘贴文本没有任何问题。 但是,当我尝试按Ctrl + A,我只听到“金光闪闪”类似,如果你试图抹掉从一个空的文本框的文字,你听到金光闪闪(与浏览器的地址栏中尝试)。

Answer 1:

像其他的答案表明, Application.EnableVisualStyles()被调用。 另外, TextBox.ShortcutsEnabled应设置为true 。 但是,如果你TextBox.Multiline启用,然后 按Ctrl + A 将无法正常工作 ( 参见MSDN文档 )。 使用RichTextBox ,而不是会得到解决的问题。



Answer 2:

只要创建于疑问,一个文本框keydown事件,并包括以下代码:

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


Answer 3:

你总是可以覆盖process命令键来获得所需的结果

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


Answer 4:

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

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


Answer 5:

这件事给我一次也一样,我假设你删除的呼吁Application.EnableVisualStyles(); 从你的程序? 它添加回Main()函数,一切都应该正常工作。



Answer 6:

文本框有一个方法SelectAll()和工作很适合我。 (.NET 4.5)



Answer 7:

无需处理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);
}

记得子类EDIT控制此Edit_Prc()使用WPA = SetWindowLong函数(...)其中WPA是窗口过程地址CallWindowProc的(...)

我想通了这一点通过实验,发现所有我在网上找到坚持处理WM_KEYDOWN的答案,用函数GetKeyState()后,结束了与没能阻止那恼人的蜂鸣大码!

虽然这个答案不DOTNET处理,在这样的情况下,它通常是更好地切入正题,解决它,而不是感到苦恼的是哪个版本大码包装系统可能会或可能不会为你做的,特别是如果你想为了避免对内置的战斗行为的风险。



Answer 8:

扔在我的两分钱。 在按键调用这仅仅是另一种选择。

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


文章来源: How can I allow ctrl+a with TextBox in winform?