winforms 阻止Enter键在WinForm上触发

p4rjhz4m  于 2022-11-17  发布在  其他
关注(0)|答案(7)|浏览(281)

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

出于各种原因,我不希望用户能够使用Enter键选择"Yes“选项(buttonYes)。以前,我确实需要此行为,并设置了Yes按钮的AcceptButton属性(buttonYes)。我已经删除了这个,将buttonYesAcceptButton属性设置为“None,”但是当按下Enter键时,窗体仍然会触发buttonYes.Click事件。我也尝试过处理KeyPressKeyDown事件,但是当使用Enter键时,这些事件不会被触发。这是基本的,有人遇到过这种情况吗?2我该怎么做才能实现我想要的功能?

kq4fsx7k

kq4fsx7k1#

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

为了理解发生了什么,你必须理解Form.ShowDialog(...)是如何实现的,基本上。在这个引擎盖下,ShowDialog进入了它自己的消息循环。这个消息循环有硬编码的逻辑,专门处理Enter键。
对话框 * 没有 * 关闭,因为OK按钮具有焦点,按下Enter键,WinForms执行OK按钮的单击逻辑,这将关闭窗口。对话框关闭是因为按下Enter键的消息被从消息循环中提取出来,并导致ShowDialog中断循环并关闭窗口......因此您无法通过处理按钮上的按键事件来获得所需的功能; Enter的按键事件不会被调度。通过KeyPreview的事件只是获取相同事件的另一种方式,因此这也没有帮助。
唯一有效的方法是将窗体的AcceptButton属性设置为(none)。“确定”按钮仍然可以将其DialogResult属性设置为“确定”,这样做不会中断对话框,但是将AcceptButton设置为none时,WinForms将忽略ShowDialog中的Enter单击。

cbjzeqam

cbjzeqam2#

若要修正这个问题,请将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);
}
gzszwxb4

gzszwxb43#

此外,如果您要确保使用者必须按一下按钮,而不是使用键盘,您可以在按钮上将TabStop属性设定为False

k75qkfdt

k75qkfdt4#

由于您已经更改了Accpet按钮属性:那么窗体的KeyPreview属性呢?它是设置为false还是true?也许您在某个地方设置了true,但忘记了它。请将它设置为false。

jgzswidk

jgzswidk5#

我只是不得不处理这一点,提供的解决方案都不起作用,所以我处理点击事件,如:

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

    // process mouse click...
}
svujldwt

svujldwt6#

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

x33g5p2x

x33g5p2x7#

简单的解决方案我尝试了上面的许多解决方案。这是对我有效的。

在InitializeComponent中,确保未设置AcceptButton。删除或注解掉以下代码:
//这个.接受按钮=这个.btnClose;
在按钮上添加:
这是一个错误。(有人在上面提到过这个)
如果这样做不起作用,还可以尝试将焦点从按钮上移开,并移到窗口框架上。

相关问题