C# 如何通过按键盘上的一个键来防止调用多个按键事件?

C# 如何通过按键盘上的一个键来防止调用多个按键事件?,c#,winforms,events,C#,Winforms,Events,我已将窗体的KeyPreview属性设置为true,以便在控件事件之前调用窗体的键盘事件。 表单和表单中的控件都具有类似于以下内容的KeyDown事件: 表格: 控制: private void TextBox1_KeyDown(object sender, KeyEventArgs e) { if (!e.Control && (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return)) { Messag

我已将窗体的KeyPreview属性设置为true,以便在控件事件之前调用窗体的键盘事件。 表单和表单中的控件都具有类似于以下内容的KeyDown事件:

表格:

控制:

private void TextBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (!e.Control && (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return)) {
         MessageBox.Show("Control + Enter (TextBox)");
    }
}
正如您所看到的,这两部分代码之间的区别在于,在表单事件代码中,当用户同时按下CTRL键和Enter键时,我需要调用KeyDown事件, 在文本框事件代码中,我需要在用户按下Enter键而不按住CTRL键时调用该事件

问题是,当我同时按下Ctrl键和Enter键时,上述两个事件都将调用。
如何防止调用这两个事件?

使用ProcessCmdKey等

protected override bool ProcessCmdKey(ref Message msg, System.Windows.Forms.Keys keyData)
        {
            int WM_ALRT_DOWN = 0x0104;
            int WM_KEYDOWN = 0x0100;

            if (msg.Msg == WM_ALRT_DOWN && (int)msg.WParam == (int)Keys.F4) //Alt + F4
            {
                return true;  // The key is manually processed
            }
            if (msg.Msg == WM_KEYDOWN && (int)msg.WParam == (int)Keys.Escape) //Esc 
            {
                return true;  // The key is manually processed
            }
            if (msg.Msg == WM_KEYDOWN && (int)msg.WParam == (int)Keys.Space) //Space
            {
                return true;  // The key is manually processed
            }
}

使用ProcessCmdKey和类似的命令

protected override bool ProcessCmdKey(ref Message msg, System.Windows.Forms.Keys keyData)
        {
            int WM_ALRT_DOWN = 0x0104;
            int WM_KEYDOWN = 0x0100;

            if (msg.Msg == WM_ALRT_DOWN && (int)msg.WParam == (int)Keys.F4) //Alt + F4
            {
                return true;  // The key is manually processed
            }
            if (msg.Msg == WM_KEYDOWN && (int)msg.WParam == (int)Keys.Escape) //Esc 
            {
                return true;  // The key is manually processed
            }
            if (msg.Msg == WM_KEYDOWN && (int)msg.WParam == (int)Keys.Space) //Space
            {
                return true;  // The key is manually processed
            }
}
我建议您使用textBox1_键控事件。您可以参考以下代码。我的测试成功了

   public Form1()
    {
        InitializeComponent();
        this.KeyPreview = true;
    }       
    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Control && (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return))
        {
            MessageBox.Show("Control + Enter (Form)");
        }
    }
    private void textBox1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Control)
        {
            e.Handled = true;
        }
        else if (e.KeyCode == Keys.Enter)
        {
            MessageBox.Show("Control + Enter (TextBox)");
        }
    }
我建议您使用textBox1_键控事件。您可以参考以下代码。我的测试成功了

   public Form1()
    {
        InitializeComponent();
        this.KeyPreview = true;
    }       
    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Control && (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return))
        {
            MessageBox.Show("Control + Enter (Form)");
        }
    }
    private void textBox1_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Control)
        {
            e.Handled = true;
        }
        else if (e.KeyCode == Keys.Enter)
        {
            MessageBox.Show("Control + Enter (TextBox)");
        }
    }

尝试设置为true。是否想过改用KeyUp?尝试设置为true。是否想过改用KeyUp?