1.窗口创建的时候调用CWnd::CreateEx()
CWnd::CreateEx()
-->AfxHookWindowCreate() //安装一个WH_CBT钩子
-->_AfxCbtFilterHook() //::SetWindowsHookEx(WH_CBT,_AfxCbtFilterHook, NULL, ::GetCurrentThreadId());
2.钩子安装成功以后,窗口有以下行为都将调用钩子设置函数_AfxCbtFilterHook()
a.窗口激活(HCBT_ACTIVATE)
b.产生或销毁一个窗口(HCBT_CREATEWND,HCBT_DESTROYWND)
c.最小化或最大化窗口时(HCBT_MINMAX)
d.移动窗口或改变窗口尺寸(HCBT_MOVESIZE)
e.来自系统菜单的系统命令(HCBT_SYSTEMCOMMAND)
f.从系统队列中移去一个鼠标或键盘消息(HCBT_KEYSKIPPED,HCBT_CLICKSKIPPED)
3.窗口有上述行为都将调用钩子函数_AfxCbtFilterHook()
_AfxCbtFilterHook()-->AfxGetAfxWndProc()-->AfxWndProc()-->AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam)-->CWnd::WindowProc(nMsg, wParam, lParam);
4.CWnd::WindowProc(nMsg, wParam, lParam); //这一步开始进入mfc类(CWnd)的窗口过程
CWnd::WindowProc()内部调用OnWndMsg()函数,而OnWndMsg()函数在内部又调用OnCommand()或OnNotify()等虚函数。
5.因为CWnd::OnCommand()、OnNotify()、OnCmdMsg()等等函数都是虚函数,所以它的子类如CFrameWnd,CView,CDocument,CMDIFrameWnd,CSplitterWnd,CPropertyySheet,COlePropertyPage等等子多次重写覆盖,形成多个消息处理路径分支。