【问题标题】:C# textbox disable shortcutsC# 文本框禁用快捷方式
【发布时间】:2013-09-27 08:56:59
【问题描述】:

我在 Windows 窗体应用程序中使用了一个文本框,我需要禁用快捷键 CTRL+ICTRL+H 。我尝试了许多通过谷歌找到的不同解决方案,但都不起作用。

我已经在我的应用程序中使用 CTRL+I 作为自定义快捷方式,我不想在我的文本框中通过此命令插入制表位。出于某种原因,CTRL+H 的行为就像按下删除键一样?

如果我在控件 CTRL+ICTRL+H 仍在工作。 CTRL+CCTRL+V 然后被禁用。如果我将“启用快捷方式”设置为 false,我希望所有快捷方式都会关闭。

我尝试了在某处找到的以下代码,但它也不能阻止 CTRL+ICTRL+H kbd>

    private void textBoxComment_KeyDown(object sender, KeyEventArgs e)
    {
        if ( e.Modifiers == Keys.Control )
        {
            switch(e.KeyCode)
            {
                case Keys.C:
                case Keys.X:
                case Keys.V:
                case Keys.Z:
                case Keys.I:
                case Keys.H:
                e.Handled = true;
                break;
                default:
                break;
            }
        }
    }

【问题讨论】:

    标签: c# textbox shortcut


    【解决方案1】:

    尝试覆盖ProcessCmdKey函数:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
       if ((keyData & Keys.Control) > 0 && (keyData & Keys.KeyCode) == Keys.V)
       {
           return true;
       }
       return base.ProcessCmdKey(ref msg, keyData);
    }
    

    【讨论】:

    • 我已经有一个 CTRL+I 的覆盖,它触发一个函数从 axAXVLCplugin 抓取到当前位置。但是当我按下 CTRL+I 时,我会在我的文本框中和当前位置得到一个标签。所以两者都被执行了。
    【解决方案2】:

    使用 shortcutsenabled 属性,您可以更有选择性地从鼠标和键盘中排除快捷方式。

    TextBox.ShortcutsEnabled = false;
    

    参考msdn 使用 ShortcutsEnabled 属性启用或禁用以下快捷键组合和控件的快捷菜单: CTRL+Z CTRL+E CTRL+C CTRL+Y CTRL+X CTRL+退格 CTRL+V CTRL+删除 CTRL+A Shift+删除 CTRL+L Shift+插入 CTRL+R

    【讨论】:

    • CTRL+H 和 CTRL+I 仍在工作 private void MainWindow_Load(object sender, EventArgs{ textBoxComment.ShortcutsEnabled = false; }
    • MSDN 没有解释如何“使用 ShortcutsEnabled 属性来启用或禁用”某些组合键,它只是指使用布尔属性来全局打开或关闭所有快捷方式。我能看到如何消除不需要的快捷键组合的唯一方法是在 Keydown 处理程序中专门吃掉它们(除非我遗漏了什么)。
    【解决方案3】:

    尝试同时添加e.SuppressKeyPress = true

    private void textBoxComment_KeyDown(object sender, KeyEventArgs e)
    {
        if ( e.Modifiers == Keys.Control )
        {
            switch(e.KeyCode)
            {
                case Keys.C:
                case Keys.X:
                case Keys.V:
                case Keys.Z:
                case Keys.I:
                case Keys.H:
                e.Handled = true;
                e.SuppressKeyPress = true;
                break;
                default:
                break;
            }
        }
    }
    

    【讨论】:

    • @Jones 我测试了它,你说Ctrl + H 似乎像Backspace 一样工作,当我测试时它确实如此,(有点惊讶),但是当使用我发布的代码时, 它真的被禁用了。我想你可能想发布更多代码。
    • 我刚刚尝试使用空白表格。所以我添加了一个文本框,并在函数 public Form1() { InitializeComponent() } 下方粘贴了您的代码。然后 CTRL+I 被禁用,但 CTRL+H 仍在工作。我无法添加更多代码,因为我是 StackOverflow 的新手,我现在只有评论的权利。但这并不能解释为什么在我的其他应用程序中仍然可以使用 CTRL+I。也许是因为我使用 CTRL+I 的覆盖来触发另一个功能,并且因为 CTRL+I 在文本框内仍然可用?
    • @Jones 你知道如何在C# 中注册一个事件处理程序吗?我怀疑您还没有注册KeyDown 事件的处理程序。正如我所说,它对我有用,您可以尝试一个新项目并查看它的实际效果。最后一个问题,你怎么知道 Ctrl + H 仍然启用? character 是否仍然向后删除(就像你在按下 Ctrl + H 时使用 Backspace 一样?
    【解决方案4】:

    这可能会有所帮助。我有带有 ShorcutKeys 的几个项目的 ToolStripMenu。我想在任何 TextBox 有焦点时停止它们的功能。这对我有用

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (ActiveControl is TextBox)
            {
                foreach (ToolStripMenuItem item in menu.DropDownItems)
                {
                    if (item.ShortcutKeys == Keys.None) continue;
    
                    if (item.ShortcutKeys == keyData)
                    {
                        item.ShortcutKeys = Keys.None;
    
                        var ret = base.ProcessCmdKey(ref msg, keyData);
    
                        item.ShortcutKeys = keyData;
    
                        return ret;
                    }
                }
            }
    
            return base.ProcessCmdKey(ref msg, keyData);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多