我可以禁用';关闭';使用C#的窗体的按钮?

我可以禁用';关闭';使用C#的窗体的按钮?,c#,.net,winforms,forms,interface,C#,.net,Winforms,Forms,Interface,如何禁用下图所示表单的关闭按钮?(下图显示一个消息框窗口) 上面的MessageBox是我自己生成的!我想禁用普通窗体的关闭按钮。您处理窗体的关闭事件(而不是关闭事件) 然后使用e.CloseReason决定是否真的要阻止它(UserClose)或不阻止它(TaskManager Close) 另外,上还有一个小示例。您应该重写从System.Windows.Forms.Form 改变课堂风格 myCp.ClassStyle = 0x200; 右键单击相关窗口,然后单击属性。在属性下单击事件

如何禁用下图所示表单的关闭按钮?(下图显示一个
消息框
窗口)


上面的
MessageBox
是我自己生成的!我想禁用普通窗体的关闭按钮。

您处理窗体的关闭事件(而不是关闭事件)

然后使用e.CloseReason决定是否真的要阻止它(UserClose)或不阻止它(TaskManager Close)


另外,上还有一个小示例。

您应该重写从
System.Windows.Forms.Form

改变课堂风格

myCp.ClassStyle = 0x200;

右键单击相关窗口,然后单击属性。在属性下单击事件。双击
FormClosing
事件

Windows窗体设计器将生成以下代码:

private void myWindow_FormClosing(object sender, FormClosingEventArgs e)
{

}
只需将代码更新为如下所示(add
e.Cancel=true;
):

你完了

或者,如果要禁用窗口的关闭、最大化和最小化按钮:


您可以右键单击有问题的窗口,然后单击“属性”。在属性下,将
ControlBox
属性设置为
false

如果您正在使用MDI子窗口,并且在创建窗口期间禁用关闭按钮是不可能的(即,您希望在窗体生命周期的某些时间禁用它),则以前提出的解决方案都不起作用

相反,我们必须使用以下代码:

[DllImport("user32")]
public static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

[DllImport("user32")]
public static extern bool EnableMenuItem(IntPtr hMenu, uint itemId, uint uEnable);

public static void DisableCloseButton(this Form form)
{
    // The 1 parameter means to gray out. 0xF060 is SC_CLOSE.
    EnableMenuItem(GetSystemMenu(form.Handle, false), 0xF060, 1);
}

public static void EnableCloseButton(this Form form)
{
    // The zero parameter means to enable. 0xF060 is SC_CLOSE.
    EnableMenuItem(GetSystemMenu(form.Handle, false), 0xF060, 0);
}

如果您不需要任何按钮,您可以设置
ControlBox=false
,但这不是问题所在。

我看不到图像?:(:)你可能不应该这样做,就像“不”一样处理它。或者,您可以创建自己的模型弹出窗口,并按照您喜欢的方式进行设计。在确认中,“X”等于“否”。如果用户单击该按钮,他/她不知道该回答什么,因此您必须让他们在不触摸任何内容的情况下做出决定。您是否尝试显示
是否
messagebox刚刚验证,如果您设置messagebox w只有yes/no按钮和no cancel按钮,关闭按钮在默认情况下被禁用。这正是我想要的!具有最少的winform体验(以前仅限于asp.net)这很有帮助!谢谢!
 Closing += (s, eventArgs) =>
        {
            DialogResult = DialogResult.None; //means that dialog would continue running
        };
 Closing += (s, eventArgs) =>
        {
            DialogResult = DialogResult.None; //means that dialog would continue running
        };