緣起:
最近在研究Win32平台的組合語言, 想看一下Win32API視窗程式在使用者按下右上角紅色叉叉觸發WM_CLOSE訊息後,是怎樣關閉整個視窗的,將心得寫成此篇blog.本篇blog有不足之處,日後補上,轉貼或引用本篇文章, 不必交代出處!
過程:
1.開啟Visual Studio 201x->新增專案->Visual C++ ->Win32專案->取名為traceWM_CLOSE->完成,
2.修改traceWM_CLOSE.cpp程式,在UpdateWindow(hWnd);這行的底下加入底下的程式:
PostMessage(hWnd,WM_CLOSE,0,0);
p.s.在主訊息迴圈那設中斷點導致無法按視窗右上角的紅色叉叉,只好用程式送WM_CLOSE訊息,
3.另外將return DefWindowProc(hWnd, message, wParam, lParam);這行註解,改為底下的程式:
int LRESULT=DefWindowProc(hWnd, message, wParam, lParam);
return LRESULT;
4.先在PostMessage()這行設中斷點, 按F5,
5.取消中斷點, 在GetMessage()跟DispatchMessage()這兩行設中斷,不斷按F5直到msg數值為0x10,
6.在WndProc()內第1行及return DefWindowProc()設中斷,不斷按F5,同時觀察"呼叫堆疊"的變化如下:
WM_CLOSE(0x10)
->產生WM_XXX(0x90)
->WM_WINDOWPOSCHANGING(0x46)
->WM_WINDOWPOSCHANGED(0x47) 此時視窗已消失,但"工作管理員"仍顯示該行程!
->WM_IME_SETCONTEXT(0x281)
->WM_IME_NOTIFY(0x282)
->WM_DESTROY(0x2) 此時先在PostQuitMessage(0);設中斷點,按F5可看到跳到中斷點這,
->WM_NCDESTROY(0x82), 此時已產生WM_QUIT於系統訊息queue,
7.程式到此才處理完WM_CLOSE訊息,返回主訊息迴圈,可觀察msg仍維持0x10(WM_CLOSE),這時再GetMessage()就得到WM_QUIT(0x12)而跳出迴圈, 然後return結束整個程式,此時在工作管理員已看不到這個行程!
結果:
關於以上過程各步驟的精彩截圖, 請到底下這個網址下載WORD檔來觀看:
https://drive.google.com/file/d/1eiJcAJ3KfBOps49S63CGp6kN6zyFLXIY/view?usp=sharing