フォームを閉じられないようにする

注意:
この文書は以前「.NETでいきまっしょい!」で公開していたものですが、公開以降メンテナンスされていません。 今や古い情報となった内容が記載されている場合があるのでご注意ください。

 オーバーライドしたWndProcでWM_CLOSEのメッセージを捕獲し、何も処理しないことで無かったことにする。 これにより、×ボタンなどにより閉じることができないフォームを作ることができる。 ただし、別の閉じる方法を提供しなければならない。
VB.NET
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
Public Class Form1
    Inherits System.Windows.Forms.Form

#Region " Windows フォーム デザイナで生成されたコード "
#End Region

    ' WndProcメソッドをオーバーライドし
    ' WM_CLOSEメッセージ自体を無視する
    Protected Overrides Sub WndProc(ByRef m As Message)

        Const WM_CLOSE As Integer = &H10

        ' ウィンドウを閉じない
        If m.Msg = WM_CLOSE Then

            ' 閉じる処理をキャンセル
            m.Result = IntPtr.Zero

        Else

            MyBase.WndProc(m)

        End If

    End Sub

End Class
C#
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
public class Form1 : System.Windows.Forms.Form
{
    // 途中略

    // WndProcメソッドをオーバーライドし
    // WM_CLOSEメッセージ自体を無視する
    protected override void WndProc( ref Message m )
    {
        const int WM_CLOSE = 0x10;

        // ウィンドウを閉じない
        if ( m.Msg == WM_CLOSE ) 
        {
            // 閉じる処理をキャンセル
            m.Result = IntPtr.Zero;
        }
        else
        {
            base.WndProc( ref m );
        }
    }
}