为什么有些文本框不接受Control +默认情况下select全部的快捷方式

我不知道这个问题是否是愚蠢的,但是我在我自己的程序中发现了几个文本框,它接受Control +一个快捷方式来select整个文本“默认”和“无编码”。

我不知道什么额外的信息,因为我发现这些文本框之间完全没有区别。 这些都是简单的拖放文本框。

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

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

我希望select默认..还有无论如何改变文本属性,使文本框接受所有默认的Windows快捷方式。

编辑:其他一切( Control + ZControl + XControl + CControl + V )默认情况下工作! 为什么不Control + A

更新:默认情况下接受Ctrl+A的文本框是被屏蔽的文本框 ,而不是常规文本框 。 在那个时候,我使用.NET 2.0。 但我想原来的问题是别的,因为我可以看到Ctrl+A在.NET 2.0代码中默认工作正常。

您可能正在寻找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才能工作。

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

原帖: 如何在Winform中允许Ctrl + a与TextBox?

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

这可以禁用Ctrl + A

这个问题需要一个不能以代码回避的forms给出的答案,因为其他方法核心的Win32 API不允许这样做。 如果其他方法允许,他们只是为你写代码。 🙂

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

首先,不需要处理WM_KEYDOWN! 而且也不需要testingCtrl键已经closures。 我知道这里的大多数例子(以及CodeProject和其他许多地方)都有这样的说法,但是它并不能解决无法处理的WM_CHAR时产生的嘟嘟声。

相反,尝试处理WM_CHAR并在那里做Ctrl + Aselect:

 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控件inheritance到此Edit_Prc(),其中WPA是CallWindowProc(…)的窗口过程地址。