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

本文关键字:Control 快捷方式 全选 不接受 情况下 文本 默认 为什么 | 更新日期: 2023-09-27 17:54:57

我在我的程序中发现了一些文本框,这些文本框接受Control+快捷方式选择整个文本"默认情况下"与"无编码"。

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

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

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

我想默认选择…或者无论如何要改变文本框属性,使文本框接受所有默认的Windows快捷方式?

其他所有(Control + Z, Control + X, Control + C, Control + V)默认工作!为什么不是Control + A ?

Update:默认接受Ctrl+A的文本框是遮罩文本框,而不是常规文本框。那时我正在使用。net 2.0。但是我猜原来的问题是别的东西,因为我可以看到Ctrl+A在。net 2.0代码中默认工作得很好。

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

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

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

  • CTRL + Z

  • CTRL + E

  • CTRL + C

  • CTRL + Y

  • CTRL + X

  • CTRL + 退格

  • CTRL + V

  • CTRL + 删除

  • CTRL +

  • 转变
  • + 删除

  • CTRL + L

  • 转变
  • + 插入

  • CTRL + R

但是,文档声明:

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

您可能必须使用TextBoxBase的另一个子类,如RichTextBox,为工作

事实上,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;
      }
  }

这个答案在一个类似的问题(没有标记为可接受)中对我有效

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

原文:我怎么能允许ctrl+a与文本框在winform?

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

可以禁用Ctrl+A

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