web-dev-qa-db-ja.com

C#を使用してフォームの「閉じる」ボタンを無効にできますか?

下の画像のようにフォームの閉じるボタンを無効にするにはどうすればよいですか? (下の画像はMessageBoxウィンドウを示しています)

enter image description here

上記のMessageBoxは私が生成したものです!通常のフォームの閉じるボタンを無効にしたい。

10
user1678541

フォームのClosingイベント(Closedイベントではなく)を処理します。

そして、e.CloseReasonを使用して、本当にブロックするか(UserClose)、ブロックしないか(TaskManager Close)を決定します。

また、小さな例 フォームの閉じるボタンを無効にするcodeproject もあります。

10
dsgriffin

問題のウィンドウを右クリックして、[プロパティ]をクリックします。 [プロパティ]で[イベント]をクリックします。 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に設定します。

15
Derek W

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);
}

set ControlBox = falseボタンを必要としないが、それが質問の答えではない場合。

8
Alex Jorgenson

System.Windows.Forms.Formから派生したCreateParams関数をオーバーライドする必要があります

クラスのスタイルを変更します

myCp.ClassStyle = 0x200;
5
Peru
 Closing += (s, eventArgs) =>
        {
            DialogResult = DialogResult.None; //means that dialog would continue running
        };
1
Mac Lee