为啥有些文本框默认不接受 Control + A 快捷方式全选

Posted

技术标签:

【中文标题】为啥有些文本框默认不接受 Control + A 快捷方式全选【英文标题】:Why are some textboxes not accepting Control + A shortcut to select all by default为什么有些文本框默认不接受 Control + A 快捷方式全选 【发布时间】:2011-08-18 15:34:37 【问题描述】:

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

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

注意:我说的不是这段代码:

if (e.Control && e.KeyCode == Keys.A)

    textBox1.SelectAll();

我想要默认选择...或者无论如何要更改文本框属性以便文本框接受所有默认窗口快捷方式?

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

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

【问题讨论】:

我的经验是默认情况下没有文本框响应 Ctrl+A;我不得不自己实现它(根据你的代码)。 @Heandel,很抱歉迟来的回复,我出乎意料地离开了。我认为不需要示例,因为大多数文本框默认情况下不接受 Control + A。实际上很少有人甚至不编码。可能是因为我需要提供示例。我不知道该怎么做。 @ShellShock,是的,没错。但是我的应用程序中的一些文本框可以!这到底是怎么回事.. 谁能给我一个简洁的快捷方式,我可以用它来调整 GUI 部分中的文本框属性,以便它接受所有默认的 Windows 快捷方式。 它是固定的 .NET 4.6.1,学分转到:link 它适用于 ReadOnly 和 MultiLine = true 【参考方案1】:

您可能正在寻找ShortcutsEnabled 属性。将其设置为 true 将允许您的文本框实现 Ctrl+A 快捷方式(等等)。来自文档:

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

CTRL+Z

CTRL+E

CTRL+C

CTRL+Y

CTRL+X

CTRL+退格键

CTRL+V

CTRL+删除

CTRL+A

SHIFT+删除

CTRL+L

SHIFT+插入

CTRL+R

但是,documentation 声明:

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

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

【讨论】:

@Frédéric Hamidi,是的,我已经为所有文本框打开了它。仍然在我的程序中,只有少数文本框默认接受 Control + A 快捷方式。在您提供的链接中,它显示“TextBox 控件不支持快捷键”。这是什么意思? @nawfal,不错,我没看到那张纸条。这意味着快捷键受RichTextBox(可能还有MaskedTextBox)支持,但TextBox 不支持。我会相应地更新我的答案。 @nawfal,这可能是因为TextBox 包装了本机Windows EDIT 控件,该控件仅支持快捷方式的子集。解决该问题的一种方法是从TextBox 派生您自己的类,在那里实现Ctrl+A 快捷方式并在整个项目中使用该类。 多行文本框的可怕特性,但至少在 RichTextBox 中交换很容易 如果启用 ReadOnly 属性,TextBox 控件似乎也无法使用 Ctrl+A。我不明白为什么 readonly 会禁止方便的文本选择...【参考方案2】:

这个问题想要一个无法以代码避免形式给出的答案,因为其他方法的核心 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(...) 的窗口过程地址

【讨论】:

非常不清楚。您可能想实际展示它是如何使用的。 我在另一页中以一种描述性较差的形式将其放在了另一个页面中,一个人说它对他有用……所以线索都在那里。基本上,它是一个编辑框的子类,处理 Ctrl+A 事件,然后像往常一样将控件传递回该编辑框的内置 Windows 行为。这样做可以让我们在不重写代码的情况下增强标准行为,或者覆盖不需要的行为,比如哔声。【参考方案3】:

这个答案在一个类似的问题中对我有用(未标记为已接受)

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?

【讨论】:

除非您添加一种方法来实际自动查找所选控件,否则这只适用于单个 TextBox。 这也适用于带有 DropDownStyle.DropDown 的 ComboBox。【参考方案4】:

除非你添加这样的东西,否则 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;
      
  

【讨论】:

这正是已经提到的问题。我正在寻找避免这种情况的解决方案。 我同意,在处理键盘时有一个更清洁的解决方案会很好 不过,这对我来说还是很不错的,对于任何可以一次又一次地重新输入并且不想使用任何令人困惑的方法或第三方方式的人来说。 出于某种奇怪的原因,除了选择所有内容之外,它还会发出错误提示音。编辑:添加e.SuppressKeyPress = true; 修复:) 这应该适用于带有 DropDownStyle.DropDown 的 ComboBox,因为它没有 ShortcustsEnabled 属性。【参考方案5】:

确保 Application.EnableVisualStyles(); 没有被注释掉 静态无效 Main()

那个可以禁用Ctrl+A

【讨论】:

呵呵,真是巧合,我的情况就是这样

以上是关于为啥有些文本框默认不接受 Control + A 快捷方式全选的主要内容,如果未能解决你的问题,请参考以下文章

引导表单输入仅接受文本

Ext combobox 中选择一个选项然后删除文本框的选项,在失去焦点时为啥刚才选中的选项有恢复了,速求。。

设置只读文本框默认Backcolor

从文本框控件继承的组件

Angular2 - 仅接受数字的输入字段

为啥只读文本框在 ASP.NET 中不返回任何数据?