C# 在 TextBox 焦点时防止热键

C# Prevent Hotkeys while TextBox focus

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

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

其他解决方案和问题:我想过在Hotkey前面放一个Key,比如CTRL+Hotkey,但是这些也存在问题,因为CTRL+C是Windows 复制命令等。SHIFT 是一个 UpperKey 按钮。

问题:当我在 TextBox 上写字时,我是否可以阻止热键激活而不必在表单中遍历所有热键?

编辑: 请求的一些代码。按钮代码来自存储的 XML 文件或 Hotkeys Form+Class(单独),我在其中为它们设置了 window。

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

     }

你应该试试这个 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);
        }
    }
}

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

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

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