在WinForm上停止触发输入键

时间:2012-02-07 11:32:20

标签: c# winforms dialog

我有一个基本的自定义对话框,可用于WinForms应用程序中的各种控件。该对话框如下所示:

The custom dialog

由于各种原因,我不希望用户能够使用Enter键选择“是”选项(buttonYes)。以前我确实想要这种行为,并相应地设置了Yes按钮(AcceptButton)的buttonYes属性。我已将scince删除,将buttonYes的{​​{1}}属性设置为“无”,但是当按下AcceptButton键时,表单仍会触发buttonYes.Click事件。我还尝试处理EnterKeyPress事件,但在使用KeyDown密钥时不会触发这些事件。这是基本和烦人的,有没有人遇到过这个,我该怎么做才能实现我想要的功能?

6 个答案:

答案 0 :(得分:8)

要解决此问题,请将TabStop属性设置为False并使用以下代码:

private void form1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
    if (e.KeyChar == (char)Keys.Enter)
        e.Handled = true;
}

或者,如果如你所说,你无法在KeyPressEvent中断,你需要处理ProcessKeyPreview

protected override bool ProcessKeyPreview(ref System.Windows.Forms.Message m)
{
    int _ENTER = 13;

    if (m.Msg == _ENTER)
    {
        //Do nothing
    }
    return base.ProcessKeyPreview(ref m);
}

答案 1 :(得分:6)

这里的所有答案都是错误的或有错误的重点。

enter image description here

为了理解发生了什么,你必须理解Form.ShowDialog(...)的实现方式。在幕后,ShowDialog将进入自己的消息循环。该消息循环具有硬编码逻辑,专门处理Enter键。

对话框不会关闭,因为OK按钮有焦点,按下按钮,WinForms执行OK按钮的点击逻辑,关闭窗口。对话框正在关闭,因为Enter按消息正在从调用堆栈顶部运行的消息循环中被消耗掉,并导致ShowDialog突破其循环并关闭窗口...所以你可以&# 39;通过处理按钮上的按键事件来获得所需的功能;从不发送Enter的按键事件。通过KeyPreview进行的事件只是获取相同事件的另一种方式,因此这也无济于事。

唯一有效的方法是将表单的AcceptButton属性设置为(none)。 OK按钮仍然可以将其DialogResult属性设置为OK,这样做不会破坏对话框,但是当AcceptButton设置为none时,WinForms会忽略从ShowDialog中输入点击次数。

答案 2 :(得分:4)

此外,如果您想确保用户必须点击按钮而不是使用键盘,您可以在按钮上将TabStop属性设置为False

答案 3 :(得分:1)

由于您已经更改了Accpet按钮属性:表单的KeyPreview属性如何?是假的还是真的?也许你一路上把它设置为真,忘了它。 将其设置为false。

答案 4 :(得分:1)

我只需要处理这个问题,提供的任何解决方案都无法正常工作,因此我可以处理Click事件,例如:

private void yes_Click( object sender, EventArgs e )
{
    if( e.Equals( EventArgs.Empty ) )
        return;  // ignore "Enter" key press

    // process mouse click...
}

答案 5 :(得分:0)

您应该查看* .resx或* .ressources文件。 搜索AcceptButton属性。它可能已在其中一个文件中设置。