C# 停止在WinForm上触发Enter键

C# 停止在WinForm上触发Enter键,c#,winforms,dialog,C#,Winforms,Dialog,我有一个基本的自定义对话框,用于WinForms应用程序中的各种控件。该对话框如下所示: 出于各种原因,我不希望用户能够使用Enter键选择“Yes”选项(buttonYes)。之前,我确实想要这种行为,并相应地设置了Yes按钮(buttonYes)的AcceptButton属性。我已删除此项,将buttonYes的AcceptButton属性设置为“无”,但表单仍会触发按钮。按下Enter键时,单击事件。我也尝试过处理按键或按键事件,但在使用回车键时,不会触发这些事件。这是一个基本且烦人的问

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


出于各种原因,我不希望用户能够使用
Enter
键选择“Yes”选项(
buttonYes
)。之前,我确实想要这种行为,并相应地设置了Yes按钮(
buttonYes
)的
AcceptButton
属性。我已删除此项,将
buttonYes
AcceptButton
属性设置为“无”,但表单仍会触发
按钮。按下
Enter
键时,单击
事件。我也尝试过处理
按键
按键
事件,但在使用
回车
键时,不会触发这些事件。这是一个基本且烦人的问题,有人遇到过这个问题吗?我能做些什么来实现我想要的功能?

要解决这个问题,请将
TabStop
属性设置为
False
,并使用下面的代码:

private void form1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
    if (e.KeyChar == (char)Keys.Enter)
        e.Handled = true;
}
或者,如您所说,您无法在处理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);
}

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

此外,如果您希望确保用户必须单击按钮,而不是使用键盘,则可以在按钮上将
选项卡停止
属性设置为
False

既然您已经更改了Accpet按钮属性:那么表单的KeyPreview属性呢?设置为false还是true?也许你在路上的某个地方把它设置为真,然后忘记了。
将其设置为false。

这里的所有答案都是错误的或强调错误

为了理解正在发生的事情,您必须了解Form.ShowDialog(…)基本上是如何实现的。在引擎盖下,ShowDialog将进入它自己的消息循环。该消息循环具有硬编码逻辑,专门处理回车键

对话框没有关闭,因为“确定”按钮有焦点,按enter键,WinForms执行“确定”按钮的单击逻辑,从而关闭窗口。对话框正在关闭,因为Enter press消息正在从调用堆栈顶部运行的消息循环中提取、使用,并导致ShowDialog中断其循环并关闭窗口。。。因此,您无法通过处理按钮上的按键事件来获得所需的功能;从未调度Enter的按键事件。通过KeyPreview进行的事件只是获取相同事件的另一种方式,因此这也无济于事


唯一有效的方法是将表单的AcceptButton属性设置为(none)。“确定”按钮仍然可以将其DialogResult属性设置为“确定”,因此这样做不会中断对话框,但当AcceptButton设置为“无”时,WinForms只会忽略ShowDialog中的输入单击操作。

我只需处理这个问题,并且提供的解决方案都不起作用,因此我处理单击事件,如:

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

    // process mouse click...
}

他为什么要看这些文件?这些文件中设置了一些属性。他应该澄清没有设置任何此类属性。这与问题无关。为什么不?他不希望用户使用Enter键选择按钮。如果他将按钮上的TabStop设置为false,他甚至不需要关心按下的键。TabStop不是只影响TabStop吗?Tabstop与Enter有什么关系?Enter键只是提交按钮,因为它有焦点。如果按钮无法获得焦点,它们将无法由键盘触发。事件将在那里发生,您无需编写任何代码来处理它,因为它不会按下按钮,因为它们没有焦点。谢谢您的回答。有一件事:
KeyPress
事件的委托不包含参数
KeyEventArg
的定义。相反,如果(e.KeyChar==(char)Keys.Enter)e.Handled=true,则代码将为
。再次感谢您的时间。这两种方法都不起作用(我以前试过第一种)。我对第二次有希望,但这也不会被解雇。我被这个弄糊涂了…@Killercam:谢谢你的更正。你的forms KeyPreview属性是否设置为true,如果不是,请设置它。我也尝试过。上面的
被覆盖的
事件没有激发。@Killercam:如果它被放置在dialogbox cs文件的codebehind中,它必须激发。确保没有将其放入调用对话框的文件中。这是正确答案!!(jwezorek,我在你的答案中添加了一个图像,以使人们更容易看到和消化)希望,最终它会在“已接受”的错误答案之外被投票,错误答案:-)即使我的答案更高,我相信这是正确的使用方法。正确答案,另一方面,如果你的表单中有一个包含WPF控件的ElementHost,该控件需要有自己的按钮“IsDefault”=false,否则会得到相同的行为。