我能否使用C#禁用窗体的“关闭”按钮?

11

我如何禁用一个窗体的关闭按钮,就像下面这张图片中显示的那样?(下面的图片展示了一个MessageBox窗口)

在此输入图片描述

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


我无法看到图片?:( :( - Priyank Thakkar
2
你可能不应该这样做。只需将其处理为“否”。或者,您可以创建自己的模型弹出窗口,并根据需要进行设计。 - musefan
在确认中,“X”等于“否定”。如果用户点击了它,他/她不知道该如何回答,所以您必须让他们自己决定而不触碰任何东西。 - Alex
你尝试过显示一个“是”或“否”的消息框吗? - V4Vendetta
刚刚验证了一下,如果你将消息框设置为只有“是”/“否”按钮而没有取消按钮,那么关闭按钮默认是被禁用的。 - wterbeek
5个回答

19

右键单击所涉及的窗口,然后单击“属性”。 在属性下单击“事件”。 双击“FormClosing”事件。

Windows Form Designer将生成以下代码:

private void myWindow_FormClosing(object sender, FormClosingEventArgs e)
{

}

只需将代码更新为以下内容(添加 e.Cancel = true;):

private void myWindow_FormClosing(object sender, FormClosingEventArgs e)
{
     e.Cancel = true;
}

完成了!

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

您可以右键单击需要操作的窗口,然后单击属性。在属性下设置ControlBox属性为false


这正是我想要的!由于我的winform经验很少(之前只有asp.net),这篇文章对我很有帮助!谢谢! - Ric

14

如果你正在使用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,但这并不是问题所问的。


10
你需要处理窗体的Closing事件(而不是Closed事件)。然后,你可以使用e.CloseReason来决定是否要阻止它(UserClose)或不阻止它(TaskManager Close)。此外,codeproject上有一个小例子Disabling Close Button on Forms

5
你需要覆盖从System.Windows.Forms.Form派生的CreateParams函数,并更改类样式。
myCp.ClassStyle = 0x200;

2
 Closing += (s, eventArgs) =>
        {
            DialogResult = DialogResult.None; //means that dialog would continue running
        };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接