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。