1

我已将表单的 KeyPreview 属性设置为 true,以便在控制事件之前调用表单的键盘事件。表单和表单中的控件都有 KeyDown 事件,例如:

形式:

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_KeyDown(object sender, KeyEventArgs e)
{
    if (!e.Control && (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return)) {
         MessageBox.Show("Control + Enter (TextBox)");
    }
}

如您所见,这两部分代码的区别在于,在表单事件代码中我需要在用户同时按下 CTRL 和 Enter 键时调用 KeyDown 事件,在 TextBox 事件代码中,我需要调用该事件当用户按下 Enter 键而不按住 CTRL 键时。

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

4

2 回答 2

4

我建议你使用这个textBox1_KeyUp事件。你可以参考下面的代码。我的测试成功了。

   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)");
        }
    }
于 2020-07-30T15:50:11.460 回答
0

使用 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
            }
}
于 2020-07-30T08:07:18.127 回答