c# MessageBox导致键处理程序忽略SurpressKeyPress

本文关键字:程序 SurpressKeyPress 处理 MessageBox | 更新日期: 2023-09-27 18:07:13

考虑使用以下组件的Windows窗体应用程序

partial class Form1
{
    private System.Windows.Forms.TextBox textBox = new System.Windows.Forms.TextBox();
    private void InitializeComponent()
    {
        textBox.Multiline = true;
        Controls.Add(this.textBox);
        KeyPreview = true;
        KeyDown += new System.Windows.Forms.KeyEventHandler(Form1_KeyDown);
    }
    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            e.SuppressKeyPress = true;
            if (textBox.Text.Length > 10)
                MessageBox.Show("Test");
        }
    }
}

现在,预期的行为是将文本写入textBox并按enter键。如果文本是

  • 时间不够长,什么都不应该发生(由于e.SuppressKeyPress = true;),但发生了。
  • 足够长,应弹出空MessageBox, Keys.Enter不应到达textBox分量。但是,当MessageBox弹出时,文本将包含由回车引起的换行。

这是预期的行为,或错误,或我是唯一的经验?

c# MessageBox导致键处理程序忽略SurpressKeyPress

您可以通过以下方式使用BeginInvoke调用消息框来解决这个问题:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        e.SuppressKeyPress = true;
        this.BeginInvoke(new Action(() => {
            if (textBox.Text.Length > 10)
                MessageBox.Show("Test");
        }));
    }
}