keydown事件与keys.Enter和keys.Tag

时间:2015-01-01 13:47:36

标签: c# winforms keydown

我在我的表单的一个页面中使用了一些richTextBox,在richTextBoxes的keyDown中,我写了如果按下Ctrl + Enter,sendKeys Tab键让下一个获得焦点,我也有一个keyDown事件表单,因此当用户按Ctrl + Tab时,所选页面更改为下一页 问题是,当我在richTextBox上按Ctrl + Enter时,带有Ctrl + Tab的表格的keyDown发生并且标签发生变化,为什么它会看到输入和标签相似? 抱歉我的语法不好,谢谢你的努力 主窗体的keyDown事件:

private void Main_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Tab && e.Control)
    {
        //code for changing the tabs
    }
}

richTextBoxes的keyDown事件:

private void txtControl_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control && e.KeyCode == Keys.Enter)
    {
        SendKeys.Send("{Tab}");
        e.Handled = true;
        e.SuppressKeyPress = true;
    }
}

2 个答案:

答案 0 :(得分:0)

通常,当您按下某个键时,聚焦控件会接收按下的键。您可以更改此流程的一点,将Form.KeyPreview属性设置为True。使用此设置,表单接收在聚焦控件之前按下的键。

当您处理已到达RichTextBox keydown事件处理程序的KeyDown事件时,您正在弄乱此' 流尝试插入假TAB密钥。你抑制了CTRL + ENTER键但是,在事件的退出处,TAB键被表格接收,控制位仍然设置,据我所知,没有简单的方法来重置这个位,因此你处理表单keydown中的CTRL + TAB。

幸运的是,不需要所有这些,只需使用

在Tab键顺序行中设置下一个控件
private void txtControl_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control && e.KeyCode == Keys.Enter)
    {
        Control current = sender as Control;
        this.SelectNextControl(current, true, true, true, true);
        e.SuppressKeyPress = true;
    }
}

对表单方法SelectNextControl的调用使您可以更好地控制应该发生的事情,并且不会在键盘处理中插入假的TAB键。

答案 1 :(得分:0)

您在keydown上发送标签SendKeys.Send("{Tab}");。修饰符是stil CTRL。比焦点中的MainForm的keydown捕获Tab。停止发送SendKeys.Send("{Tab}");