第三天,訊息攔截與處理
埋鉤子:
hhook
setwindowshookex
(//埋勾子
_in_
intidhook
,//勾子型別(
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
();
setwindowlong
ptr(
hwnd
, gwlp_wndproc
,(dword_ptr
)afxwndproc)
建立視窗分兩步, ø
註冊 ø
視窗就像是外形,而處理函式就像是隱藏在外觀內部的功能和邏輯,或者說造成乙個機械人,外形是個機械人,它還需要能動,能走,能說話。
在mfc
的視窗建立機制中,第一步是通過**的方式,最終通過
win32 api
向系統註冊;
第二步通過埋下的鉤子,在視窗建立成功時,把相應的
功能植入
進去。
MFC 使用MFC建立視窗
標頭檔案 mfc是乙個封裝了windowsapi且物件導向的c 類庫,同時也是乙個應用程式的框架結構。另外,並非所有mfc提供的函式都是類的成員,mfc也以 全域性函式的形式,為使用者提供了各類字首為afx的函式,可供使用者在必要時隨時隨地進行呼叫。由mfc建立的應用,我們不能夠直接看到其程式的入口...
MFC視窗建立過程
本文針對單文件模式的mfc程式進行分析。一步步說明,如何建立視窗並顯示。首先我們建立乙個單文件的mfc程式 test。csingledoctemplate pdoctemplate pdoctemplate new csingledoctemplate idr mainframe,runtime c...
MFC視窗的建立
新建乙個空的win32 project 我的編譯器版本vs2013 在新增項中選擇空專案 工程建立完成後,在標頭檔案與原始檔的資料夾中分別新增乙個乙個.h檔案與.cpp檔案起名為mfc.h與mfc.cpp 自擬 在標頭檔案中分別建立應用程式類與視窗架構類,如下 include mfc標頭檔案 cla...