在研究Duilib框架時的測試小例子,只需在OnSize下斷點,並雙擊標題欄,即會在OnSize中命令斷點,可分析調用流程,解釋見後
//5、最後,響應了OnSize消息
> DuiLib_d.dll!DuiLib::WindowImplBase::OnSize(unsigned int uMsg, unsigned int wParam, long lParam, int & bHandled) 行 225 C++
DuiLib_d.dll!DuiLib::WindowImplBase::HandleMessage(unsigned int uMsg, unsigned int wParam, long lParam) 行 370 + 0x1f 字節 C++
DuiLib_d.dll!DuiLib::CWindowWnd::__WndProc(HWND__ * hWnd, unsigned int uMsg, unsigned int wParam, long lParam) 行 436 + 0x1b 字節 C++
user32.dll!__InternalCallWinProc@20() + 0x2b 字節
user32.dll!UserCallWinProcCheckWow() + 0x30a 字節
user32.dll!SendMessageWorker() + 0x26a39 字節
user32.dll!RealDefWindowProcWorker() + 0x263 字節
user32.dll!RealDefWindowProcW() + 0x5b 字節
uxtheme.dll!6bd3690f()
[下面的框架可能不正確和/或缺失,沒有爲 uxtheme.dll 加載符號]
uxtheme.dll!6bd365e8()
user32.dll!DefWindowProcW() + 0x263 字節
user32.dll!__InternalCallWinProc@20() + 0x2b 字節
user32.dll!UserCallWinProcCheckWow() + 0x30a 字節
user32.dll!CallWindowProcW() + 0x97 字節
//4、此處 WM_WINDOWPOSCHANGED 0x47 窗口位置尺寸發生變化
DuiLib_d.dll!DuiLib::CWindowWnd::HandleMessage(unsigned int uMsg, unsigned int wParam, long lParam) 行 496 + 0x22 字節 C++
DuiLib_d.dll!DuiLib::WindowImplBase::HandleMessage(unsigned int uMsg, unsigned int wParam, long lParam) 行 390 C++
DuiLib_d.dll!DuiLib::CWindowWnd::__WndProc(HWND__ * hWnd, unsigned int uMsg, unsigned int wParam, long lParam) 行 436 + 0x1b 字節 C++
user32.dll!__InternalCallWinProc@20() + 0x2b 字節
user32.dll!UserCallWinProcCheckWow() + 0x30a 字節
user32.dll!DispatchClientMessage() + 0xf0 字節
user32.dll!___fnINLPWINDOWPOS@4() + 0x41 字節
ntdll.dll!_KiUserCallbackDispatcher@12() + 0x36 字節
win32u.dll!_NtUserMessageCall@28() + 0xc 字節
user32.dll!RealDefWindowProcWorker() + 0xbd 字節
user32.dll!RealDefWindowProcW() + 0x5b 字節
uxtheme.dll!6bd4343e()
uxtheme.dll!6bd431c5()
uxtheme.dll!6bd36bb8()
uxtheme.dll!6bd365e8()
user32.dll!DefWindowProcW() + 0x263 字節
user32.dll!__InternalCallWinProc@20() + 0x2b 字節
user32.dll!UserCallWinProcCheckWow() + 0x30a 字節
user32.dll!CallWindowProcW() + 0x97 字節
//3、此處是DefWindowProcW向窗口發送了命令消息 0x112 WM_SYSCOMMAND wPrarm = 0xF032 窗口最大化命令
DuiLib_d.dll!DuiLib::CWindowWnd::HandleMessage(unsigned int uMsg, unsigned int wParam, long lParam) 行 496 + 0x22 字節 C++
DuiLib_d.dll!DuiLib::WindowImplBase::OnSysCommand(unsigned int uMsg, unsigned int wParam, long lParam, int & bHandled) 行 257 + 0x14 字節 C++
DuiLib_d.dll!DuiLib::WindowImplBase::HandleMessage(unsigned int uMsg, unsigned int wParam, long lParam) 行 372 + 0x1f 字節 C++
DuiLib_d.dll!DuiLib::CWindowWnd::__WndProc(HWND__ * hWnd, unsigned int uMsg, unsigned int wParam, long lParam) 行 436 + 0x1b 字節 C++
user32.dll!__InternalCallWinProc@20() + 0x2b 字節
user32.dll!UserCallWinProcCheckWow() + 0x30a 字節
user32.dll!DispatchClientMessage() + 0xf0 字節
user32.dll!___fnDWORD@4() + 0x49 字節
ntdll.dll!_KiUserCallbackDispatcher@12() + 0x36 字節
win32u.dll!_NtUserMessageCall@28() + 0xc 字節
user32.dll!RealDefWindowProcWorker() + 0xbd 字節
user32.dll!RealDefWindowProcW() + 0x5b 字節
uxtheme.dll!6bd4343e()
uxtheme.dll!6bd5cbd8()
uxtheme.dll!6bd36bb8()
uxtheme.dll!6bd365e8()
user32.dll!DefWindowProcW() + 0x263 字節
user32.dll!__InternalCallWinProc@20() + 0x2b 字節
user32.dll!UserCallWinProcCheckWow() + 0x30a 字節
user32.dll!CallWindowProcW() + 0x97 字節
//2、此處是 雙擊標題欄的消息 0xa3 WM_NCLBUTTONDBLCLK
DuiLib_d.dll!DuiLib::CWindowWnd::HandleMessage(unsigned int uMsg, unsigned int wParam, long lParam) 行 496 + 0x22 字節 C++
DuiLib_d.dll!DuiLib::WindowImplBase::HandleMessage(unsigned int uMsg, unsigned int wParam, long lParam) 行 390 C++
DuiLib_d.dll!DuiLib::CWindowWnd::__WndProc(HWND__ * hWnd, unsigned int uMsg, unsigned int wParam, long lParam) 行 436 + 0x1b 字節 C++
user32.dll!__InternalCallWinProc@20() + 0x2b 字節
user32.dll!UserCallWinProcCheckWow() + 0x30a 字節
user32.dll!DispatchMessageWorker() + 0x234 字節
user32.dll!_DispatchMessageW@4() + 0x10 字節
//1、此處是程序響應的消息循環
DuiLib_d.dll!DuiLib::CPaintManagerUI::MessageLoop() 行 2012 + 0xc 字節 C++
BDMonSetup.exe!wWinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, wchar_t * lpCmdLine, int nCmdShow) 行 41 + 0x8 字節 C++
BDMonSetup.exe!__tmainCRTStartup() 行 547 + 0x2c 字節 C
BDMonSetup.exe!wWinMainCRTStartup() 行 371 C
kernel32.dll!75fc62c4()
ntdll.dll!__RtlUserThreadStart() + 0x2f 字節
ntdll.dll!__RtlUserThreadStart@8() + 0x1b 字節
雙擊消息從步驟2開始
2.雙擊標題欄,窗口過程對非客戶區窗口消息進行處理,並用SendMessage向窗口發送窗口最大化的命令
3.窗口過程處理,響應窗口最大化消息,發送窗口,大小位置變化消息
4.窗口過程處理,修改窗口的大小和位置,並調用了OnSize變化的事件
5.OnSize被調用了
其中消息之間使用了SendMessage,因此,可以形成上面的堆棧,SendMessage可以相象爲,直接通過窗口過程的地址調用窗口過程