【问题标题】:Can I disable the 'close' button of a form using C#? [duplicate]我可以使用 C# 禁用表单的“关闭”按钮吗? [复制]
【发布时间】:2023-04-02 17:07:01
【问题描述】:

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

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

【问题讨论】:

  • 我看不到图片? :( :(
  • 您可能不应该这样做。只需像“否”一样处理它。或者,您可以创建自己的模型弹出窗口并根据自己的喜好进行设计
  • 'X' 在确认中等于 'No'。如果用户点击它,他/她不知道该回答什么,所以你必须让他们在不触碰任何东西的情况下做出决定。
  • 您是否尝试显示Yes No 消息框
  • 刚刚验证,如果你设置的消息框只有是/否按钮,没有取消按钮,关闭按钮默认是禁用的。

标签: c# .net winforms forms interface


【解决方案1】:

右键单击相关窗口,然后单击“属性”。在属性下单击事件。双击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

【讨论】:

  • 这正是我所追求的!拥有最少的 winform 经验(以前仅限 asp.net)这有帮助!谢谢!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      你应该重写从System.Windows.Forms.Form派生的CreateParams函数

      并更改类样式

      myCp.ClassStyle = 0x200;
      

      【讨论】:

        【解决方案5】:
         Closing += (s, eventArgs) =>
                {
                    DialogResult = DialogResult.None; //means that dialog would continue running
                };
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-10
          • 1970-01-01
          • 1970-01-01
          • 2013-04-14
          相关资源
          最近更新 更多