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

10 .net c# forms interface winforms

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

在此输入图像描述

MessageBox被我产生以上!我想禁用普通表单的关闭按钮.

Der*_*k W 15

右键单击相关窗口,然后单击"属性".在Properties下单击Events.双击该FormClosing事件.

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

private void myWindow_FormClosing(object sender, FormClosingEventArgs e)
{

}
Run Code Online (Sandbox Code Playgroud)

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

private void myWindow_FormClosing(object sender, FormClosingEventArgs e)
{
     e.Cancel = true;
}
Run Code Online (Sandbox Code Playgroud)

你完成了!

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

您可以右键单击相关窗口,然后单击"属性".在"属性"下,将属性设置ControlBoxfalse.


dsg*_*fin 10

您处理表单的Closing事件(而不是Closed事件).

然后使用e.CloseReason来决定是否确实要阻止它(UserClose)(TaskManager Close).

此外,在codeproject 上的表单上有一个小例子禁用关闭按钮.


Ale*_*son 9

如果您正在使用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);
}
Run Code Online (Sandbox Code Playgroud)

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


Per*_*eru 5

你应该覆盖CreateParams派生的函数System.Windows.Forms.Form

并改变班级风格

myCp.ClassStyle = 0x200;
Run Code Online (Sandbox Code Playgroud)