松尾です。 プログラム終了時の次のようになっているというのが私の理解です。 - 左上のバツボタン - WM_CLOSE発生 - DestroyWindow() をコール - ウィンドウが破棄(画面から削除)される - この時ウィンドウに関連したリソースも破棄されるのか? - WM_DESTROY発生 - WM_NCDESTROY発生 - この時ウィンドウに関連したリソースも破棄されるのか? どこで画面から消えて、どこで関連したリソースが破棄されるのかは よくわかっていません。 それでも最初に ShowWindow(SW_HIDE) しておけば、画面から消えるので デフォルトアイコンに戻るのが見えないのではないかだろうか? という予想をしていました。 keycode.c にコードを追加して どの時点でアイコンがデフォルトに戻るのか 調べやすくしました。 - 左上のバツボタン - WM_CLOSE発生 - "close?"メッセージ - YES時、次へ - NO時、なにもしない(ウィンドウは閉じない) - "hide?"メッセージ - YES時、ShowWindow(SW_HIDE) をコール - 画面から消える - NO時、なにもしない - DestroyWindow() をコール - ウィンドウが破棄(画面から削除)される - WM_DESTROY発生 - "WM_DESTROY" メッセージ 手もとでは以前と同様に、ShowWindow(SW_HIDE) しなくても デフォルトアイコンに変化するのが見えないようです。 # 実は一瞬デフォルトアイコンに戻ってるのかな… 永田さんの環境で試してもらえますか? ---- diff --git a/teraterm/keycode/keycode.c b/teraterm/keycode/keycode.c index 5e5fe1760..1e3f9d653 100644 --- a/teraterm/keycode/keycode.c +++ b/teraterm/keycode/keycode.c @@ -252,12 +252,26 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, TimerProc(hWnd, wParam); break; case WM_DESTROY: + MessageBoxA(hWnd, "WM_DESTROY", "keycode", MB_OK); OnDestroy(hWnd); PostQuitMessage(0); break; case WM_DPICHANGED: OnDpiChanged(hWnd, wParam, lParam); break; + case WM_CLOSE: { + int r = MessageBoxA(hWnd, "close?", "keycode", MB_YESNO); + if (r == IDNO) { + break; + } + r = MessageBoxA(hWnd, "hide?", "keycode", MB_YESNO); + if (r == IDYES) { + ShowWindow(hWnd, SW_HIDE); + MessageBoxA(hWnd, "SH_HIDE", "keycode", MB_OK); + } + DestroyWindow(hWnd); + break; + } default: return (DefWindowProc(hWnd, msg, wParam, lParam)); }