在研究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可以相象为,直接通过窗口过程的地址调用窗口过程