C# 如何允许在winform中使用文本框按住ctrl+a键?
我在这里问了一个已经问过甚至回答过的问题: 但这个答案对我不适用。我有以下代码:C# 如何允许在winform中使用文本框按住ctrl+a键?,c#,winforms,textbox,keyboard-shortcuts,C#,Winforms,Textbox,Keyboard Shortcuts,我在这里问了一个已经问过甚至回答过的问题: 但这个答案对我不适用。我有以下代码: public class LoginForm : Form { private TextBox tbUsername; public LoginForm() { tbUsername = new TextBox(); tbUsername.ShortcutsEnabled = true; tbUsername.Multiline = fal
public class LoginForm : Form
{
private TextBox tbUsername;
public LoginForm()
{
tbUsername = new TextBox();
tbUsername.ShortcutsEnabled = true;
tbUsername.Multiline = false;
Controls.Add(tbUsername);
}
}
private void tbUsername_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.A)
{
if (sender != null)
((TextBox)sender).SelectAll();
}
}
文本框出现了,我可以在上面写字,我可以剪切、复制和粘贴文本,没有任何问题。
但是,当我尝试按Ctrl+A时,我只会听到类似于您尝试从空文本框中删除文本时听到的闪烁,请使用浏览器的地址栏进行尝试。您始终可以覆盖过程命令键以获得所需的结果
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)
&& tbUsername.Focused)
{
tbUsername.SelectAll();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
我也曾经遇到过这种情况,我假设您取消了对Application.EnableVisualStyles的调用;你的节目?将它添加回主功能,一切都会正常工作。无需处理WM_键控!我知道这里的大多数示例、CodeProject和许多其他地方都说有,但它不能解决未处理的WM_字符出现时产生的蜂鸣音 相反,请尝试以下方法:
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将编辑控件子类化为此编辑\u Prc。。。其中WPA是CallWindowProc的窗口过程地址
我通过实验发现了这一点,在发现我在网上找到的所有答案都坚持使用GetKeyState处理WM_KEYDOWN后,最终得到了更大的代码,无法阻止恼人的嘟嘟声
虽然这个答案不适用于dotnet,但在这种情况下,通常最好切入正题并解决它,而不是纠结于大型代码包装系统的哪个版本可能适合您,特别是如果你想避免与内在行为作斗争的风险。Textbox有一种方法SelectAll,对我来说效果很好。net 4.5只需为相关文本框创建一个按键事件,并包含以下代码:
public class LoginForm : Form
{
private TextBox tbUsername;
public LoginForm()
{
tbUsername = new TextBox();
tbUsername.ShortcutsEnabled = true;
tbUsername.Multiline = false;
Controls.Add(tbUsername);
}
}
private void tbUsername_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.A)
{
if (sender != null)
((TextBox)sender).SelectAll();
}
}
与其他答案一样,应调用Application.EnableVisualStyles。此外,TextBox.ShortcutsEnabled也应设置为true。但是如果您的TextBox.Multiline已启用,则Ctrl+A将不起作用。改用RichTextBox可以解决这个问题。快速回答是,如果使用多行true,则必须显式调用全选
private void tbUsername_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.A && e.Control)
{
tbUsername.SelectAll();
}
}
把我的两分钱投进去。在按键下调用它只是另一种选择
private void TxtBox_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '\x1')
{
TxtBox.SelectAll();
e.Handled = true;
}
}
这是我的代码,工作正常
private void mainSimPlus_KeyDown(object sender, KeyEventArgs e)
{
e.Handled = true;
if (e.Control == true && e.KeyCode == Keys.A)
{
if (SelectAllTextBox(txt1))
return;
if (SelectAllTextBox(txt2))
return;
}
}
private bool SelectAllTextBox(TextBox txt)
{
if (txt.Focused)
{
txt.SelectAll();
return true;
}
else
return false;
}
你的代码对我有用吗。我可以使用CTRL+A和其他快捷键。我认为shift+向上箭头应该一次选择一个字母。shift和end选择all。是的,它也适用于我。。您正在使用哪个版本的.net?@spajce不确定,我在哪里可以检查它?您可以从项目的属性中检查它。@spajce目标框架:.net框架4.5,所以我想它是相当新的…谢谢您修复了它。是否有一种方法仅对一个表单执行此操作,因此我希望使用MyForm.EnableVisualStyles;?我不确定这是不是正确的答案,因为我的项目在Main中添加了这一行,而且CTRL+A不起作用。Wierd…同样-不适用于我-存在Application.EnableVisualStyles,并且Ctrl+A不起作用,Ctrl+C。。。。奇怪。这是一个快速而肮脏的解决方案,适用于所有需要Application.EnableVisualStyles;不适用。对我很有用。谢谢。如果您希望即使文本框不是具有焦点的控件也能使用此功能,请删除代码&&tbUsername.Focused并在.SelectAll调用后添加此语句:tbUsername.focus;。请参见此处:如果代码中有Application.EnableVisualStyles,但CTRL+A仍然不起作用,这是一个很好的解决方法。关于多行的部分必须讨论默认行为。如果e.Control&&e.KeyCode==Keys.A Textbox.SelectAll;在KeyDown事件处理程序中,对我来说很好。@Dan正确,如果您使用多行并且仍然需要一个标准文本框,那么您必须像这样处理它。一个奇怪的设计决定读作:bug by MS.显然在4.7中再次被打破。TextBox和RichTextBox都是从TextBoxBase派生的,都有ShortcutsEnabled属性,这似乎没有任何效果,至少在ctrl-A方面是这样。RichTextBox有一个属性RichTextShortcutsEnabled,但它不可访问,但不知何故,它下面的属性启用了RichTextBox的ctrl-a。