为什么有些文本框默认情况下不接受 Control + A 快捷键进行全选?

44

我在我的程序中发现了一些文本框,它们默认情况下接受Control+A 快捷键选择整个文本,而且无需编码。

我不知道需要提供什么额外信息才能使所有文本框都启用该功能,因为我在这些文本框之间没有任何区别。它们都是简单的拖放文本框。

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

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

我希望默认情况下可以选择...或者有没有办法更改文本框属性,使文本框接受所有默认的Windows快捷键?除了 Control + Z, Control + X, Control + C, Control + V,其他快捷键都能正常工作。为什么不能使用 Control + A

更新: 默认情况下接受 Ctrl+A 的文本框是掩码文本框而不是常规文本框。此时我用的是.NET 2.0版本。但是我猜最初的问题可能是其他原因,因为我在.NET 2.0代码中可以看到 Ctrl+A 正常工作。


我的经验是默认情况下没有文本框响应Ctrl+A;我不得不自己实现它(根据您的代码)。 - Polyfun
@Heandel,抱歉回复晚了,我突然出差了。我认为不需要举例子,因为大多数文本框默认情况下不接受Control + A。实际上,即使没有编码,只有很少的文本框可以这样做。也许为此我需要提供示例。但我不知道该怎么做。 - nawfal
@ShellShock,是的,没错。但是我的应用程序中有一些文本框确实会出现这种情况!这到底是怎么回事。。 - nawfal
有没有人能够提供一个简洁的快捷方式,让我可以在GUI部分轻松地调整文本框属性,以便它接受所有默认的Windows快捷键。 - nawfal
1
它适用于固定的.NET 4.6.1版本,鸣谢:链接。 它可以与ReadOnly和MultiLine = true一起使用。 - ArieKanarie
5个回答

67
您可能正在寻找 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

然而,文档指出:

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

你可能需要使用另一个TextBoxBase子类,例如RichTextBox才能实现该功能。


2
@Frédéric Hamidi,是的,我已经为所有文本框启用了它。但在我的程序中,只有少数文本框默认情况下接受 Control + A 快捷键。你给出的链接中说:“TextBox 控件不支持快捷键。”这是什么意思? - nawfal
1
@nawfal,好眼力,我没有看到那个注释。这意味着快捷键被RichTextBox(可能还有MaskedTextBox)支持,但不被TextBox支持。我会相应地更新我的答案。 - Frédéric Hamidi
3
@nawfal,这可能是因为TextBox封装了本机Windows的EDIT控件,它只支持快捷键的子集。解决问题的方法之一是从TextBox派生出自己的类,在其中实现Ctrl+A快捷键,然后在整个项目中使用该类。 - Frédéric Hamidi
4
多行文本框的一个可怕特点是,但至少在 RichTextBox 中进行替换很容易。 - Alan Macdonald
3
如果启用了ReadOnly属性,TextBox控件似乎也无法使用Ctrl+A。我不明白为什么只读会阻止方便的文本选择... - Nyerguds
显示剩余9条评论

26

实际上,除非您添加类似于以下内容,否则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;
      }
  }

3
这正是问题中已经提到的。我正在寻找一种避免这种情况的解决方案。 - nawfal
1
我同意,当处理键盘相关问题时,有一个更清晰的解决方案会很好。 - Junior Mayhé
2
对我来说,这样做还不错,对于那些可以一遍又一遍地重新输入并且不想使用任何混淆的方法或第三方方式的人来说也是如此。 - Kaitlyn
2
由于某种奇怪的原因,这会在选择所有内容的同时发出错误提示音。编辑:添加“e.SuppressKeyPress = true;”可以解决这个问题 :) - Nyerguds
这应该适用于DropDownStyle.DropDown的ComboBox,因为它没有ShortcustsEnabled属性。 - sjlewis

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

原始帖子:如何在winform中允许使用TextBox的Ctrl+A快捷键?


除非您添加一种方法来自动查找所选控件,否则这仅适用于一个单独的文本框。 - Nyerguds
这也适用于DropDownStyle.DropDown的ComboBox。 - sjlewis

2

请确保在 static void Main() 中没有注释掉 Application.EnableVisualStyles(); 这行代码。

否则可能会禁用 Ctrl+A 快捷键。


哎呀,真是巧啊,这正是我的情况。 - user1306322

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


非常不清楚。你可能需要展示一下它的使用方法。 - Nyerguds
我在另一页中以不太详细的形式拥有它,一个人说它对他起作用...所以所有线索都在那里。基本上,它是子类化编辑框,处理Ctrl+A事件,然后将控件正常地传回内置的Windows行为。这样做允许我们增强标准行为而无需重写其代码,或者覆盖不良行为,例如蜂鸣声。 - user1418124

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接