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



第三天,消息拦截与处理

埋钩子:

HHOOK SetWindowsHookEx( //埋勾子

_In_ int idHook, //勾子类型(WH_CBT

_In_ HOOKPROC lpfn//勾子处理函数

_In_opt_ HINSTANCE hmod//进程句柄

_In_ DWORD dwThreadId) //线程ID

};

//分全局勾子和局部勾子(全局可以勾取其它进程消息)

组长叫情报小队长去安插内线:

void AFXAPI AfxHookWindowCreate(CWndpWnd)

于是小队长先登记了任务号,从传递台得到这次总任务的信息:

_AFX_THREAD_STATEpThreadState = _afxThreadState.GetData();

然后,安插了一个内线在建造局,嘱咐不要暴露了,除了窗口创建成功消息外,不要管;一旦窗口创建成功,一定比别人先拿到这个消息,通知“钩子哥”进行处理

pThreadState->m_hHookOldCbtFilter = ::SetWindowsHookEx(WH_CBT,

_AfxCbtFilterHookNULL, ::GetCurrentThreadId());

 

钩子哥收到消息后首先登记,并从传送台取得主任务的有效数据

_AFX_THREAD_STATEpThreadState = _afxThreadState.GetData();

会先一步处理掉一些障碍,先取得任务的委托人要求的窗口

CWndpWndInit = pThreadState->m_pWndInit;

并从内线提供的信息中,确定建造局建造的位置(窗口句柄)

HWND hWnd = (HWND)wParam; //获取刚刚创建的窗口句柄

把两者的绑定,这样以后委托人说我的东西,行动组就能马上找到建造的位置,反过来也是如此,看到一幢房子,就知道是谁名下的~

好吧,其实建造局只管建立房子,是谁的他们不管,他们留下(HWND)钥匙就走了,而业主需要拿着证明来接收房子~

 pWndInit->Attach(hWnd);

接下来,管家出现,把大门钥匙、客厅钥匙、会议室钥匙、储藏室钥匙......全拿到,为了让业主不会混淆,买了一块钥匙箱(Map类数组),把钥匙放到对应房间的标签格子中~

CHandleMappMap = afxMapHWND(TRUE)

......

pMap->SetPermanent(m_hWnd = hWndNewthis);

m_permanentMap[(hWndNew)] = permObpFrame;

 

在庄园里,有自己的保安、供水、食物系统,一般的问题都会通知管家,由管家找相关人员处理,如果处理不了的或不需要内部处理的,通知外界来处理(系统的DefaultProc

 

WNDPROC afxWndProc = AfxGetAfxWndProc();

         SetWindowLongPtr(hWndGWLP_WNDPROC,(DWORD_PTR)afxWndProc)

 

 

 

创建窗口分两步,

Ø 注册

Ø 窗口创建出来后还有附带上一些处理函数

窗口就像是外形,而处理函数就像是隐藏在外观内部的功能和逻辑,或者说造成一个机器人,外形是个机器人,它还需要能动,能走,能说话。

MFC的窗口创建机制中,第一步是通过代理的方式,最终通过Win32 API向系统注册

第二步通过埋下的钩子,在窗口创建成功时,把相应的功能植入进去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值