【问题标题】:Detect the Tab Key Press in TextBox检测文本框中的 Tab 键按下
【发布时间】:2016-03-10 10:59:31
【问题描述】:

我正在尝试检测 TextBox 中的 Tab 按键。 我知道 Tab 键不会触发 KeyDownKeyUpKeyPress 事件。我发现:Detecting the Tab Key in Windows Forms of BlackWasp in internet。 他们建议覆盖我所做的 ProcessCmdKey,但它也没有被触发。 是否有可靠的方法来检测 Tab 键按下?

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{

    bool baseResult = base.ProcessCmdKey(ref msg, keyData);

    if (keyData == Keys.Tab && textBox_AllUserInput.Focused)
    {
        MessageBox.Show("Tab key pressed.");
        return true;
    }
    if (keyData == (Keys.Tab | Keys.Shift) && textBox_AllUserInput.Focused)
    {
        MessageBox.Show("Shift-Tab key pressed.");
        return true;
    }

    return baseResult;
}

根据 Cody Gray 的建议,我将代码修改如下:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData == Keys.Tab && textBox_AllUserInput.Focused)
        {
            MessageBox.Show("Tab key pressed.");        }
        if (keyData == (Keys.Tab | Keys.Shift) && textBox_AllUserInput.Focused)
        {
            MessageBox.Show("Shift-Tab key pressed.");        }

        return base.ProcessCmdKey(ref msg, keyData);
    }

问题是它没有捕捉到 Tab 键的按下。

【问题讨论】:

  • 是的,ProcessCmdKey() 非常可靠。没人知道你是怎么弄的。
  • 我的代码是:protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { bool baseResult = base.ProcessCmdKey(ref msg, keyData); if (keyData == Keys.Tab && textBox_AllUserInput.Focused) { MessageBox.Show("Tab 键被按下。");返回真; } 返回基本结果;我尝试了所有 3 个答案,但没有一个有效。
  • 如果要覆盖它,请不要调用基本实现。将base.ProcessCmdKey(...) 移动到函数的末尾。
  • 当你想处理TextBoxTab 键时,你可以简单地处理PreviewKeyDown 事件,当然你不需要覆盖ProcessCmdKey 并检查什么是焦点控件!
  • Cody Gray,很抱歉,我还没有那么精通 C#。我不知道如何:子类 TextBox 并覆盖 IsInputKey。

标签: c# .net winforms textbox


【解决方案1】:

某些按键,例如 TABRETURNESC 和箭头键,通常会被某些控件忽略,因为它们是不考虑输入按键。

您可以处理控件的PreviewKeyDown 事件来处理这些击键并将它们设置为输入键。

private void textBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    if(e.KeyData == Keys.Tab)
    {
        MessageBox.Show("Tab");
        e.IsInputKey = true;
    }
    if (e.KeyData == (Keys.Tab | Keys.Shift))
    {
        MessageBox.Show("Shift + Tab");
        e.IsInputKey = true;
    }
}

【讨论】:

  • @CodyGray 已记录在案。阅读文档中的remarks 部分。当您可以以这种方式处理Tab 键时,为什么需要子类化。
  • 当然,这是一个记录在案的 hack。 :-) 并没有减少任何黑客攻击。有很多理由更喜欢子类化、封装、关注点分离以及好的设计是其中的主要因素。可重用性是另一个引人注目的问题。 TextBox 的子类可能会比这段代码多花 3-4 行,这不是很大的努力。
  • @CodyGray 所有这些概念都是好东西,关注点分离,封装等。但是处理 Tab 字符并不是将控件子类化的好理由,特别是在 OP 要处理的情况下某个TextBox 控件的键并在此之后运行逻辑。它可以简单地使用事件来处理:)
  • @CodyGray 就我而言,他想要运行特定逻辑的事实是子类化的更多理由。假设 OP 想要运行一个方法, F,写在他的表单类中,他在继承的TextBox中覆盖ProcessCmdKey后应该如何运行该方法?当然,这只是一个技术讨论,将对 OP 和未来的读者有用:)
  • Cody Gray,我很抱歉,但我还没有那么精通 C#。我不知道如何:子类 TextBox 并覆盖 IsInputKey。
【解决方案2】:

您可以使用下面的代码来确定何时按下 TAB 键:

 private void input_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
    { 
        // Check here tab press or not
        if (e.KeyCode == Keys.Tab)
        {
           // our code here
        }

        // Check for the Shift Key as well
        if (Control.ModifierKeys == Keys.Shift && e.KeyCode == Keys.Tab) {
           
        }
    }

【讨论】:

    猜你喜欢
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2010-11-21
    相关资源
    最近更新 更多