keys.Enter 和 keys.Tag 的按键事件

keydown event with keys.Enter and keys.Tag

我在我的表单的一页中使用了一些 richTextBoxes,在 richTextBoxes 的 keyDown 中,我写了如果按下 Ctrl+Enter,sendKeys Tab 键以便下一个获得焦点,我还有一个 keyDown 事件在整个表单上,所以当用户按 Ctrl+Tab 时,所选页面会切换到下一页 问题是,当我在 richTextBoxes 上按 Ctrl+Enter 时,使用 Ctrl+Tab 的表单的 keyDown 发生并且选项卡更改,为什么它看到 enter 和 tab 一样? 抱歉我的语法不好,谢谢你的努力 主窗体的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;
    }
}

通常,当您按下一个键时,获得焦点的控件会接收到按下的键。您可以稍微更改此流程,将 Form.KeyPreview 属性 设置为 True。使用此设置,窗体接收在获得焦点的控件之前按下的键。

在处理已到达 RichTextBox keydown 事件处理程序的 KeyDown 事件时,您试图插入伪造的 TAB 键,这 'normal' 流程弄乱了。您按下了 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 键。

您在按键时发送制表符 SendKeys.Send("{Tab}");。修饰符仍然是 CTRL。比焦点中的 MainForm 的 keydown 捕获 Tab。停止发送 SendKeys.Send("{Tab}");?