2

如何在 KeyDown 中确定⇧</kbd> + Tab was pressed.

private void DateTimePicker_BirthDate_KeyDown(object sender, KeyEventArgs e)
{
   if (e.KeyCode == Keys.Tab && e.Modifiers == Keys.Shift)
   {
       //do stuff
   }
}

不能工作,因为永远不会在同一秒内完全按下两个键。你总是先换档,然后换另一档..

4

6 回答 6

8

它不能工作,因为永远不会在同一秒内完全按下两个键。

你是对的,你的代码不起作用,但你的理由是错误的。问题是这个Tab键有一个特殊的含义——它会导致焦点发生变化。未调用您的事件处理程序。

如果您使用不同的键而不是Tab,那么您的代码将正常工作。


如果你真的想改变某个特定控件的Shift+行为Tab,可以通过覆盖来完成,ProcessCmdKey但请记住,许多用户使用该Tab键在表单中导航,更改该键的行为可能会惹恼这些用户。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (DateTimePicker_BirthDate.Focused && keyData == (Keys.Tab | Keys.Shift))
    {
        MessageBox.Show("shift + tab pressed");
        return true;
    }
    else
    {
        return base.ProcessCmdKey(ref msg, keyData);
    }
}
于 2012-06-22T06:12:13.823 回答
2

如果您正在寻找像 Ctrl K + D 这样的按键组合(Tab,然后是 Shift),您将不得不使用取自MSDN social的这个修改后的示例。

private StringBuilder _pressedKeys = new StringBuilder();

private void DateTimePicker_BirthDate_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Tab)
    {
        _pressedKeys.Append("Tab");
        return;
    }

    if (e.Modifiers == Keys.Shift)
    {
        _pressedKeys.Append("Shift");
        return;
    }

    if (_pressedKeys.ToString()."TabShift")
    {
        MessageBox.Show("It works!");
         _pressedKeys.Clear();
    }
    else
    {
         _pressedKeys.Clear();
    }

    base.OnKeyDown(e);
}
于 2012-06-22T06:17:51.537 回答
0

先钩住 Tab keypress 事件,然后在事件期间,检查 Shift 键的状态。请记住,有两个 shift 键;确保你检查他们两个。

这篇非常相关的帖子展示了如何检查修饰键的状态:

如何检测当前按下的键?

编辑:另一个值得赞成的回答者提供的见解是必须禁止制表键的默认行为(更改控制焦点)。

于 2012-06-22T06:12:20.110 回答
0

你可以在这篇文章中找到你的答案

于 2012-06-22T06:17:13.933 回答
0

这很简单。

您可以使用 TextBox 中的 KeyUp 事件来做到这一点

    private void txtBox1_KeyUp(object sender, KeyEventArgs e)
    {               
        if (e.KeyCode == Keys.Tab && e.Shift == false) // TAB Key Pressed
        {

        }

        if (e.KeyCode == Keys.Tab && e.Shift == true) // TAB + SHIFT Key Pressed
        {

        }
    }


    Or

    Using this you can identify Any Key is press inside the form

    //Add This code inside the Form_Load Event
    private void Form1_Load(object sender, EventArgs e)
    {
    this.KeyUp += new System.Windows.Forms.KeyEventHandler(KeyPressEvent);
    this.KeyPreview = true;
    }

    //Create this Custom Event
    private void KeyPressEvent(object sender, KeyEventArgs e) 
    {
        if (e.KeyCode == Keys.Tab && e.Shift == false) // TAB Key Pressed
        {

        }

        if (e.KeyCode == Keys.Tab && e.Shift == true) // TAB + SHIFT Key Pressed
        {

        }
    }
于 2017-03-17T10:38:26.237 回答
0

这很简单。

Using this you can identify Any Key is press inside the form

//Add This code inside the Form_Load Event
private void Form1_Load(object sender, EventArgs e)
{
    this.KeyUp += new System.Windows.Forms.KeyEventHandler(KeyPressEvent);
    this.KeyPreview = true;
}

//Create this Custom Event
private void KeyPressEvent(object sender, KeyEventArgs e) 
{
    if (e.KeyCode == Keys.Tab && e.Shift == false) // TAB Key Pressed
    {

    }

    if (e.KeyCode == Keys.Tab && e.Shift == true) // TAB + SHIFT Key Pressed
    {

    }
}
于 2017-03-17T10:43:16.997 回答