【问题标题】:How can I allow ctrl+a with TextBox in winform?如何在winform中允许带有TextBox的ctrl + a?
【发布时间】:2013-04-18 08:29:34
【问题描述】:

我在这里问已经问过(甚至回答过)的问题: Why are some textboxes not accepting Control + A shortcut to select all by default

但是这个答案对我不起作用。我有这个代码:

public class LoginForm : Form
{
    private TextBox tbUsername;

    public LoginForm()
    {
        tbUsername = new TextBox();
        tbUsername.ShortcutsEnabled = true;
        tbUsername.Multiline = false;
        Controls.Add(tbUsername);
    }
}

文本框出现,我可以在上面写字,我可以在上面剪切、复制和粘贴文本,没有任何问题。 但是,当我尝试按 Ctrl+A 时,我只会听到类似于您尝试从空文本框中删除文本时听到的“bling”(尝试一下)使用浏览器的地址栏)。

【问题讨论】:

  • FWIW 你的代码对我有用。我可以使用CTRL + A 和其他快捷方式。我认为shift + up arrow 应该一次选择一个字母。 shift and end 全选。
  • 是的,它也适用于我。您使用的是什么版本的 .net?
  • @spajce 不确定,在哪里可以查看?
  • 你可以从你项目的properties查看。
  • @spajce "目标框架:.NET Framework 4.5" 所以我猜它是相当新的......

标签: c# winforms textbox keyboard-shortcuts


【解决方案1】:

这是我的代码,运行良好

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

【讨论】:

    【解决方案2】:

    就像其他答案所示,Application.EnableVisualStyles() 应该被调用。此外,TextBox.ShortcutsEnabled 应设置为 true。但是如果您的TextBox.Multiline 已启用,那么 Ctrl+A 将不起作用 (see MSDN documentation)。改用RichTextBox 可以解决这个问题。

    【讨论】:

    • 关于 MultiLine 的部分一定是在谈论默认行为。将 if (e.Control && e.KeyCode == Keys.A) Textbox.SelectAll(); 放入 KeyDown 事件处理程序对我来说效果很好。
    • @Dan 正确,如果您使用 MultiLine 并且仍然需要标准文本框,则必须像这样解决它。 MS 的一个奇怪的设计决定(读作:错误)。
    • 显然在 4.7 中再次损坏。
    • TextBoxRichTextBox 都派生自 TextBoxBase 两者都有 ShortcutsEnabled 属性,这似乎没有任何效果,至少对于 ctrl-a 而言。 RichTextBox 有一个属性RichTextShortcutsEnabled,但它不可访问,但也许在它下面是启用 ctrl-a for RichTextBox 的原因。
    【解决方案3】:

    只需为相关文本框创建一个 keydown 事件并包含以下代码:

    private void tbUsername_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Control && e.KeyCode == Keys.A)
        {
            if (sender != null)
                ((TextBox)sender).SelectAll();
        }
    }
    

    【讨论】:

    • 如果您的代码中有 Application.EnableVisualStyles() 但 CTRL+A 仍然不起作用,这是非常好的解决方法。
    【解决方案4】:

    您始终可以覆盖进程命令键以获得所需的结果

    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();”的人来说,这是一个快速而肮脏的解决方案。不适用。对我非常有用。谢谢。
    • 如果您希望即使 TextBox 不是具有焦点的控件也能正常工作,则删除代码“&& tbUsername.Focused”并在 .SelectAll() 调用之后添加此语句:“tbUsername 。重点();”。见这里:stackoverflow.com/questions/18050714/…
    【解决方案5】:

    投入我的两分钱。在按键下调用它只是另一种选择。

    private void TxtBox_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == '\x1')
        {
            TxtBox.SelectAll();
            e.Handled = true;
        }
    }
    

    【讨论】:

      【解决方案6】:

      快速回答是,如果您使用多行 true,则必须显式调用全选。

      private void tbUsername_KeyDown(object sender, KeyEventArgs e)
      {
          if (e.KeyCode == Keys.A && e.Control)
          {
              tbUsername.SelectAll();
          }
      }
      

      【讨论】:

        【解决方案7】:

        Textbox 有一个方法SelectAll(),对我来说效果很好。 (.net 4.5)

        【讨论】:

          【解决方案8】:

          无需处理 WM_KEYDOWN!我知道这里的大多数示例(以及 CodeProject 和许多其他地方)都说有,但它并不能解决每当出现未处理的 WM_CHAR 时产生的蜂鸣声。

          试试这个:

          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(...) 的窗口过程地址

          我通过实验发现了这一点,在发现我在网上找到的所有答案都坚持使用 GetKeyState() 处理 WM_KEYDOWN 后,最终得到了更大的代码,无法阻止那个烦人的哔哔声!

          虽然此答案不涉及 dotnet,但在这种情况下,通常最好切入正题并解决它,而不是为大型代码包装系统的哪个版本可能会或可能不会为您做这件事而苦恼,尤其是如果您想避免与固有行为作斗争的风险。

          【讨论】:

            【解决方案9】:

            这也发生在我身上一次,我假设你从你的程序中删除了对 Application.EnableVisualStyles(); 的调用?将其添加回Main() 函数,一切正常。

            【讨论】:

            • 感谢修复它。有没有办法只为一种形式做到这一点,所以我想MyForm.EnableVisualStyles();
            • 我不确定这是不是正确的答案,因为我的项目在 Main 中添加了这一行,并且 CTRL+A 不起作用。奇怪...
            • 同样 - 不适合我 - Application.EnableVisualStyles() 存在并且 Ctrl+A 不工作,Ctrl+C 是....很奇怪。
            猜你喜欢
            • 1970-01-01
            • 2016-01-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多