禁用Windows窗体上的退出按钮?

4

有没有一种方法可以禁用Windows表单上的退出按钮,而不必导入某些外部.dll文件? 我使用以下代码通过导入dll来禁用退出按钮,但我不喜欢它。 有没有更简单(内置)的方法?

    public Form1()
    {
        InitializeComponent();
        hMenu = GetSystemMenu(this.Handle, false);
    }

    private const uint SC_CLOSE = 0xf060;
    private const uint MF_GRAYED = 0x01;
    private IntPtr hMenu;

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

    [DllImport("user32.dll")]
    private static extern int EnableMenuItem(IntPtr hMenu, uint wIDEnableItem, uint wEnable);

    // handle the form's Paint and Resize events 

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        EnableMenuItem(hMenu, SC_CLOSE, MF_GRAYED);
    }

    private void Form1_Resize(object sender, EventArgs e)
    {
        EnableMenuItem(hMenu, SC_CLOSE, MF_GRAYED);
    }
7个回答

5

您无法轻松地禁用退出按钮(位于右上角,用于关闭表单)。

但是,您可以通过将ControlBox属性设置为false来完全隐藏该按钮。

ControlBox可以随时开启和关闭,因此如果您想动态允许某些时间关闭而在其他时间不关闭,则可以使用此选项。

或者,您可以处理FormClosing事件并在选择时取消关闭操作。

这是一个演示。

创建一个新的Windows Forms项目。

在表单上放置一个CheckBox控件,文本为“ControlBox”。将其单击事件连接到此处:

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    ControlBox = checkBox1.Checked;
}

然后,在窗体上再放置一个文本为“取消关闭”的复选框控件。将窗体的FormClosing事件与其挂钩:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    e.Cancel = checkBox2.Checked;
}

运行应用程序并开始使用复选框进行操作。您很快就会看到事情是如何工作的。


5
为了在表单关闭事件中禁用关闭按钮,请编写以下代码。
 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        e.Cancel = true;
    }

如果我在FormClosing回调中有Dispose()逻辑,会怎么样? - undefined
阅读文档后,似乎微软建议使用"FormClosed"事件来触发资源清理。此外,建议添加对CloseReason属性的检查,以便在关闭时Windows能够正确关闭您的应用程序。 - undefined

4

我发现了一个很实用的帮助类:

禁用关闭按钮并防止窗体被移动(C#版本)

它实际上可以做更多的事情,但基本上和你在示例代码中所做的几乎一样。这个帮助类为您挂钩了加载/调整大小事件,因此您不必自己记住去做它。


3

是的。

将form.ControlBox设置为false将隐藏关闭按钮。虽然,它也会隐藏最小化和最大化按钮。

您还可以设置form.FormBorderStyle = FormBorderStyle.None,这将隐藏整个标题栏。

如果您想显示X按钮但只是阻止窗体关闭,请重写OnClosing并将e.Cancel属性设置为true。


2
捕捉FormClosing事件并在参数中取消它。

不完全是我要找的,但仍然相当有用。谢谢! - Kredns

1

使用Visual Studio选择窗体,进入属性并将ControlBox属性设置为false,或尝试this.ControlBox = false;frmMainForm.ControlBox = false;


0

禁用按钮可以在不导入dll的情况下实现。ControlBox = false会使最小化和最大化按钮以及边框消失,但它并不会禁用关闭“X”按钮-它只是隐藏了。这个解决方案可以禁用它:

private const int CP_NOCLOSE_BUTTON = 0x200;
protected override CreateParams CreateParams
{
    get
    {
       CreateParams myCp = base.CreateParams;
       myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_BUTTON ;
       return myCp;
    }
}

来源:https://www.codeproject.com/kb/cs/disableclose.aspx


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