下の画像のようにフォームの閉じるボタンを無効にするにはどうすればよいですか? (下の画像はMessageBox
ウィンドウを示しています)
上記のMessageBox
は私が生成したものです!通常のフォームの閉じるボタンを無効にしたい。
フォームのClosingイベント(Closedイベントではなく)を処理します。
そして、e.CloseReasonを使用して、本当にブロックするか(UserClose)、ブロックしないか(TaskManager Close)を決定します。
また、小さな例 フォームの閉じるボタンを無効にするcodeproject もあります。
問題のウィンドウを右クリックして、[プロパティ]をクリックします。 [プロパティ]で[イベント]をクリックします。 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
に設定します。
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
ボタンを必要としないが、それが質問の答えではない場合。
System.Windows.Forms.Form
から派生したCreateParams
関数をオーバーライドする必要があります
クラスのスタイルを変更します
myCp.ClassStyle = 0x200;
Closing += (s, eventArgs) =>
{
DialogResult = DialogResult.None; //means that dialog would continue running
};