Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在文本框中检测Tab键按下_C#_.net_Winforms_Textbox - Fatal编程技术网

C# 在文本框中检测Tab键按下

C# 在文本框中检测Tab键按下,c#,.net,winforms,textbox,C#,.net,Winforms,Textbox,我正在尝试检测文本框中的Tab键按下情况。 我知道Tab键不会触发KeyDown、keydup或KeyPress事件。我发现:在互联网上检测Windows窗体中的Tab键。 他们建议重写ProcessCmdKey,我确实这么做了,但它也没有被触发。 是否有可靠的方法检测Tab键按下 protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { bool baseResult = base.ProcessCm

我正在尝试检测
文本框中的Tab键按下情况。
我知道Tab键不会触发
KeyDown
keydup
KeyPress
事件。我发现:在互联网上检测Windows窗体中的Tab键。 他们建议重写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按键。

您可以使用此代码来显示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) {

        }
    }

某些控件通常会忽略某些按键,例如TAB键、RETURN键、ESC键和箭头键,因为它们不被视为输入按键

您可以处理控件的事件来处理这些按键笔划,并将它们设置为输入键

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

是的,ProcessCmdKey()非常可靠。没人知道你是怎么搞砸的。我的代码是:protectedoverride bool ProcessCmdKey(ref Message msg,Keys keyData){bool baseResult=base.ProcessCmdKey(ref msg,keyData);if(keyData==Keys.Tab&&textBox\u AllUserInput.Focused){MessageBox.Show(“按下制表键”);return true;}return baseResult;}我尝试了所有3个答案,但都不起作用。如果要覆盖基本实现,请不要调用它。将
base.ProcessCmdKey(…)
移动到函数末尾。当您想要处理
文本框的
选项卡
键时,您可以简单地处理事件,当然不需要重写
ProcessCmdKey
并检查什么是焦点控件!科迪·格雷,对不起,我还不太精通C#。我不知道如何:对TextBox进行子类化并覆盖IsInputKey。@CodyGray有文档记录。阅读文档中的部分。当您可以用这种方式处理
选项卡
键时,为什么需要子类化。当然,这是一个有文档记录的黑客行为。:-)这并不意味着它是一种黑客行为。选择子类化、封装、关注点分离和良好的设计是其中的主要原因有很多。可重用性是另一个引人注目的问题。TextBox的子类可能比这段代码多花3-4行,这并不是一个很大的努力。@CodyGray所有的概念都是好东西,关注点分离,封装,等等,但处理制表符并不是为控件子类的好理由,特别是在OP希望为某个
TextBox
控件处理该键并在此之后运行逻辑的情况下。只需使用事件即可处理:)@CodyGray他希望在之后运行特定逻辑的事实,就我而言,这是创建子类的更多理由。假设OP想要运行一个方法F,该方法是在他的form类中编写的,在他在继承的
文本框中重写
ProcessCmdKey
之后,他应该如何运行该方法?当然,这只是一个技术性的讨论,对OP和未来的读者很有用:)科迪·格雷,对不起,我还不太精通C#。我不知道如何:子类TextBox和覆盖IsInputKey。