我可以使用C#禁用表单的“关闭”按钮吗?

时间:2012-09-14 10:23:38

标签: c# .net winforms forms interface

如何禁用表单中的关闭按钮,如下图所示? (下图显示了MessageBox窗口)

enter image description here

上面的MessageBox由我生成!我想禁用普通表单的关闭按钮。

5 个答案:

答案 0 :(得分:13)

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

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

private void myWindow_FormClosing(object sender, FormClosingEventArgs e)
{

}

只需将代码更新为这样(添加e.Cancel = true;):

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

你已经完成了!

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

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

答案 1 :(得分:10)

您处理表单的关闭事件(而非Closed事件)。

然后你使用e.CloseReason来决定你是否真的要阻止它(UserClose)(TaskManager关闭)。

此外,Disabling Close Button on Forms上有一个小例子codeproject

答案 2 :(得分:8)

如果您正在使用MDI子窗口并且在创建窗口期间禁用关闭按钮被排除(即您希望在窗体生命期间的某些时间禁用它),以前提出的解决方案都不会起作用¹。< / p>

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

[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,但这不是问题所在。

答案 3 :(得分:5)

您应该覆盖从CreateParams

派生的System.Windows.Forms.Form函数

并更改班级风格

myCp.ClassStyle = 0x200;

答案 4 :(得分:1)

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