为什么有些文本框不接受Control +默认情况下select全部的快捷方式
我不知道这个问题是否是愚蠢的,但是我在我自己的程序中发现了几个文本框,它接受Control +一个快捷方式来select整个文本“默认”和“无编码”。
我不知道什么额外的信息,因为我发现这些文本框之间完全没有区别。 这些都是简单的拖放文本框。
注意:我不是在谈论这段代码:
if (e.Control && e.KeyCode == Keys.A) { textBox1.SelectAll(); }
我希望select默认..还有无论如何改变文本属性,使文本框接受所有默认的Windows快捷方式。
编辑:其他一切( Control + Z
, Control + X
, Control + C
, Control + 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(…)的窗口过程地址。