Moo*_*ght 5 c# dialog winforms
我有一个基本的自定义对话框,用于WinForms应用程序中的各种控件.该对话框如下所示:

由于各种原因,我不希望用户能够使用Enter密钥来选择"是"选项(buttonYes).以前我确实想要这种行为,并相应地设置AcceptButton了Yes按钮(buttonYes)的属性.我有scince删除了这个,将buttonYes's AcceptButton属性设置为'None',但是buttonYes.Click当Enter按下该键时,表单仍会触发该事件.我也尝试处理KeyPress或KeyDown事件,但Enter使用密钥时不会触发这些事件.这是基本和恼人的,有没有人遇到过这个,我该怎么做才能实现我想要的功能?
这里的所有答案都是错误的或有错误的重点.
为了理解发生了什么,你必须理解Form.ShowDialog(...)是如何实现的.在幕后,ShowDialog将进入自己的消息循环.该消息循环具有硬编码逻辑,专门处理Enter键.
对话框没有关闭,因为OK按钮有焦点,按下了按键,WinForms执行OK按钮的单击逻辑,关闭窗口.对话框正在关闭,因为Enter按消息正在从调用堆栈顶部运行的消息循环中被消耗掉,并导致ShowDialog突破其循环并关闭窗口...所以你可以'通过处理按钮上的按键事件来获得您想要的功能; 从不发送Enter的按键事件.通过KeyPreview的事件只是获取相同事件的另一种方式,因此这也无济于事.
唯一有效的方法是将表单的AcceptButton属性设置为(none).OK按钮仍然可以将其DialogResult属性设置为OK,这样做不会破坏对话框,但是当AcceptButton设置为none时,WinForms只会忽略ShowDialog中的Enter clicks.
要解决此问题,请将TabStop属性设置为False并使用以下代码:
private void form1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Enter)
e.Handled = true;
}
Run Code Online (Sandbox Code Playgroud)
或者,如果如您所说,您无法在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);
}
Run Code Online (Sandbox Code Playgroud)