您的位置:首页 > 其它

MFC(三) 窗口创建机制编故事(下)

2015-10-22 19:52 176 查看

第三天,消息拦截与处理
埋钩子:
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)钥匙就走了,而业主需要拿着证明来接收房子~
 pWndInit->Attach(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向系统注册;
第二步通过埋下的钩子,在窗口创建成功时,把相应的功能植入进去。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MFC 窗口创建