WM_CLOSE

WM_CLOSEは、ウィンドウが閉じられる時(DestroyWindowが呼ばれる前)に発生するウィンドウメッセージ。

WM_CLOSE message - Windows applications | Microsoft Docs

WM_CLOSEの時に、DefWindowProcの既定の処理に通さないことで、DestroyWindowによるウィンドウの破棄をキャンセルすることができる。

閉じるボタンを押すと、WM_CLOSEが発生する。
この時、"Close?"というOKCancelなメッセージボックスを表示して、戻り値がIDOKでない場合は、0を返してしまう。
こうすれば、キャンセルボタンが押された時はDefWindowProcを通らないので、その後の既定の処理によりDestroyWindowによるウィンドウ破棄が発生しない。
つまり閉じられない。

右上の閉じるボタン
右上の閉じるボタン

右上の閉じるボタンを押すと、

確認ダイアログ
確認ダイアログ

"Close?"という確認ダイアログが表示される。

"キャンセル"を押すと、

閉じない
閉じない

閉じない。

"OK"を押すと、ウィンドウが閉じて破棄され、プログラムが終了する。

これだけだと、メニューアイテムや、ボタンが押された時に、この確認ダイアログでキャンセルができないので、

メニューアイテムや、ボタンが押された時は、WM_DESTROYのトピックの時のようなDestroyWindowではなく、SendMessageでWM_CLOSEを送信するようにする。
そうすると、WM_CLOSEが発生し、確認ダイアログが表示される。

メニューアイテム
メニューアイテム

メニューアイテム選択でも、

確認ダイアログ
確認ダイアログ

確認ダイアログが出てくるし、

ボタン
ボタン

ボタン押しの時でも、

確認ダイアログ
確認ダイアログ

確認ダイアログが出てくる。
当然、キャンセルの仕組みは同じ。

Sample/winapi/WM_CLOSE/WM_CLOSE/src/WM_CLOSE at master · bg1bgst333/Sample · GitHub