第三天,消息拦截与处理 埋钩子:
HHOOK SetWindowsHookEx( //埋勾子 _In_ int idHook, //勾子类型(WH_CBT) _In_ HOOKPROC lpfn, //勾子处理函数 _In_opt_ HINSTANCE hmod, //进程句柄 _In_ DWORD dwThreadId) //线程ID }; //分全局勾子和局部勾子(全局可以勾取其它进程消息) | 组长叫情报小队长去安插内线:
void AFXAPI AfxHookWindowCreate(CWnd* pWnd) | 于是小队长先登记了任务号,从传递台得到这次总任务的信息:
_AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData(); | 然后,安插了一个内线在建造局,嘱咐不要暴露了,除了窗口创建成功消息外,不要管;一旦窗口创建成功,一定比别人先拿到这个消息,通知“钩子哥”进行处理
pThreadState->m_hHookOldCbtFilter = ::SetWindowsHookEx(WH_CBT, _AfxCbtFilterHook, NULL, ::GetCurrentThreadId()); | 钩子哥收到消息后首先登记,并从传送台取得主任务的有效数据
_AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData(); | 会先一步处理掉一些障碍,先取得任务的委托人要求的窗口
CWnd* pWndInit = pThreadState->m_pWndInit; | 并从内线提供的信息中,确定建造局建造的位置(窗口句柄)
HWND hWnd = (HWND)wParam; //获取刚刚创建的窗口句柄 | 把两者的绑定,这样以后委托人说我的东西,行动组就能马上找到建造的位置,反过来也是如此,看到一幢房子,就知道是谁名下的~ 好吧,其实建造局只管建立房子,是谁的他们不管,他们留下(HWND)钥匙就走了,而业主需要拿着证明来接收房子~
接下来,管家出现,把大门钥匙、客厅钥匙、会议室钥匙、储藏室钥匙......全拿到,为了让业主不会混淆,买了一块钥匙箱(Map类数组),把钥匙放到对应房间的标签格子中~
CHandleMap* pMap = afxMapHWND(TRUE) ...... pMap->SetPermanent(m_hWnd = hWndNew, this); m_permanentMap[(hWndNew)] = permOb(pFrame); | 在庄园里,有自己的保安、供水、食物系统,一般的问题都会通知管家,由管家找相关人员处理,如果处理不了的或不需要内部处理的,通知外界来处理(系统的DefaultProc)
WNDPROC afxWndProc = AfxGetAfxWndProc(); SetWindowLongPtr(hWnd, GWLP_WNDPROC,(DWORD_PTR)afxWndProc) | |
创建窗口分两步,
Ø 注册
Ø 窗口创建出来后还有附带上一些处理函数
窗口就像是外形,而处理函数就像是隐藏在外观内部的功能和逻辑,或者说造成一个机器人,外形是个机器人,它还需要能动,能走,能说话。
在MFC的窗口创建机制中,第一步是通过代理的方式,最终通过Win32 API向系统注册;
第二步通过埋下的钩子,在窗口创建成功时,把相应的功能植入进去。