【问题标题】:C# Prevent Hotkeys while TextBox focusC# 在 TextBox 焦点时防止热键
【发布时间】:2015-03-14 20:40:57
【问题描述】:

我有一个包含多个 C# 表单文本框的程序。我已经为激活某些功能的整个表单设置了热键。我的问题是我的热键已设置到 Form KeyDown 事件上,如果我在 TextBox 上写一些东西,它们就会激活。

示例:一个热键可能是 I。每次我将字母写到文本框时,热键都会激活。

其他解决方案和问题:我曾考虑在热键前面放置一个键,例如 CTRL+Hotkey,但这些也存在问题,因为 CTRL+C 是 Windows 复制命令等。SHIFT 是UpperKey 按钮。

问题:当我在 TextBox 上书写时,我是否可以阻止热键激活,而无需通过表单中的所有热键?

编辑:根据要求提供一些代码。按钮代码来自存储的 XML 文件或热键表单+类(单独),我在其中为它们设置了一个窗口。

    public Hotkeys hotkeysForm = new Hotkeys();

    void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        toggleInformation = hotkeysForm.toggleInformation;

        if (e.Control && e.KeyCode == toggleInformation)
        {
            showInfo(true);
        }
        else if (e.KeyCode == toggleInformation)
        {
            if (!isInfoActive)
                showInfo();
            else
                hideInfo();               
        }

     }

【问题讨论】:

  • 您是如何设置热键的?你对他们有什么反应?显示一些代码?
  • 在下面发布了一些代码。

标签: c# forms textbox key


【解决方案1】:

当 texbox 是一个活动控件时,您可以禁用热键。为所有文本框添加 EnterLeave 事件:

    private void textBox_Enter(object sender, EventArgs e)
    {
        KeyPreview = false;
    }

    private void textBox_Leave(object sender, EventArgs e)
    {
        KeyPreview = true;
    }

【讨论】:

  • 这是一个解决方案,但我有多个文本框(~200),您可以在其中插入各种内容。这只是很多工作要做。
  • 您可以为所有文本框设置一个事件处理程序
  • 谢谢!有用。我只需要遍历所有的框并在其中插入这些事件。
【解决方案2】:

如果它可以解决您的问题,您应该尝试这个 hack, 创建一个扩展文本框并在您的代码中使用它。您可以在 hotkeyPressed 检查中处理是否在文本框中写入按下的键。

public class ETextBox : System.Windows.Forms.TextBox
{
    protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e)
    {
        if (hotKeyPressed) // this is the condition when you don't want to write in text.
        {
            //Do whatever you want to do in this case.
        }
        else
        {
            base.OnKeyDown(e);
        }
    }
}

【讨论】:

    猜你喜欢
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 2016-09-04
    • 2021-10-29
    相关资源
    最近更新 更多