为什么有些文本框不接受Control + A默认选择all的快捷方式

问题描述 投票:42回答:5

我在我的程序中找到了一些文本框,它们接受Control + A快捷方式,以“默认情况下”选择整个文本,“无编码”。

我不知道我必须在这里提供哪些额外信息才能为所有这些信息启用它,因为我发现这些文本框之间完全没有区别。它们都是简单的拖放文本框。

注意:我不是在谈论这段代码:

if (e.Control && e.KeyCode == Keys.A)
{
    textBox1.SelectAll();
}

我想要默认选择...或者是否有更改文本框属性,以便文本框接受所有默认的Windows快捷方式?

其他所有(Control + ZControl + XControl + CControl + V)默认工作!为什么不Control + A

更新:默认接受Ctrl+A的文本框是masked textboxes,而不是常规文本框。那时我使用的是.NET 2.0。但我想最初的问题是别的,因为我可以看到Ctrl+A在.NET 2.0代码中默认工作正常。

c# select textbox .net-2.0
5个回答
66
投票

您可能正在寻找ShortcutsEnabled酒店。将其设置为true将允许您的文本框实现Ctrl + A快捷方式(以及其他)。从文档:

使用ShortcutsEnabled属性启用或禁用以下快捷键组合:

  • CTRL + Z
  • CTRL + E
  • CTRL + C
  • CTRL + Y
  • CTRL + X
  • CTRL + Backspace键
  • CTRL + V
  • CTRL + DELETE
  • CTRL + A
  • SHIFT + DELETE
  • CTRL + L
  • SHIFT + INSERT
  • CTRL + R

但是,documentation说:

TextBox属性值为true时,Multiline控件不支持CTRL + A快捷键。

您可能必须使用TextBoxBase的另一个子类,例如RichTextBox,才能使用它。


25
投票

确实,除非你添加这样的东西,否则CTRL + A将无效:

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

4
投票

这个答案在一个类似的问题(我没有标记为已接受)中为我工作

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) 
        && txtYourTextBox.Focused)
    {
        txtYourTextBox.SelectAll();
        return true;
    }            
    return base.ProcessCmdKey(ref msg, keyData);
}

原帖:How can I allow ctrl+a with TextBox in winform?


2
投票

确保Application.EnableVisualStyles();未在静态void Main()中注释掉

这可以禁用Ctrl + A.


1
投票

这个问题需要一个不能以代码避免的形式给出的答案,因为其他方法核心的Win32 API不允许这样做。如果其他方法允许,他们只是为您编写代码。 :)

所以真正的问题是:最小的,最好的方法是什么?这对我有用:

首先,没有必要处理WM_KEYDOWN!并且无需测试已经按下的Ctrl键。我知道这里的大多数例子(以及CodeProject和许多其他地方)都说有,但它无法治愈每当WM_CHAR出现而未处理时产生的嘟嘟声。

相反,尝试处理WM_CHAR并在那里执行Ctrl + A选择:

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(...)的窗口过程地址

© www.soinside.com 2019 - 2024. All rights reserved.