HHOOK
SetWindowsHookEx( //裝載一個(gè)鉤子
int idHook, //描述被裝載的鉤子的類型,參數(shù)見下面
HOOKPROC lpfn, //鉤子回調(diào)函數(shù)的地址,如果 dwThreadId 為 0 那么這個(gè)回調(diào)函數(shù)會(huì)在不同的進(jìn)程中創(chuàng)建,它必須寫在在DLL中
HINSTANCE hMod, //DLL的句柄
DWORD dwThreadId //描述要鉤住的線程ID,如果這個(gè)參數(shù)為0,則會(huì)鉤住桌面上的所有線程
); //如果函數(shù)調(diào)用成功,返回值是成功開啟的鉤子句柄,如果失敗,返回值為 0
/*
idHook 相關(guān)的參數(shù):
WH_CALLWNDPROC :安裝一個(gè)鉤子,監(jiān)視系統(tǒng)發(fā)送給窗口的消息,更多信息如下:
LRESULT CALLBACK
CallWndProc(
int nCode, //描述鉤子程序是否一定要處理這個(gè)消息 如果 nCode == HC_ACTION,那么鉤子程序一定要處理這個(gè)消息,如果 nCode 的值小于零,則一定要跳過這個(gè)消息
WPARAM wParam, //描述這個(gè)消息是否來自于當(dāng)前的線程,如果這個(gè)消息是來自于當(dāng)前的線程那么該值為非零,否則該值為零
LPARAM lParam //一個(gè)指向 CWPSTRUCT 結(jié)構(gòu)體的指針,更多相關(guān)信息如下:
);
typedef struct {
LPARAM lParam; //消息的擴(kuò)展信息
WPARAM wParam; //消息的擴(kuò)展信息
UINT message; //消息
HWND hwnd; //接受消息的窗口
} CWPSTRUCT, *PCWPSTRUCT;
WH_CALLWNDPROCRET :安裝一個(gè)鉤子,監(jiān)視系統(tǒng)發(fā)送已經(jīng)處理后給窗口的消息,更多信息如下:
LRESULT CALLBACK
CallWndRetProc(
int nCode, //描述鉤子程序是否一定要處理這個(gè)消息 如果 nCode == HC_ACTION,那么鉤子程序一定要處理這個(gè)消息,如果 nCode 的值小于零,則一定要跳過這個(gè)消息
WPARAM wParam, //描述這個(gè)消息是否來自于當(dāng)前的線程,如果這個(gè)消息是來自于當(dāng)前的線程那么該值為非零,否則該值為零
LPARAM lParam //一個(gè)指向 CWPSTRUCT 結(jié)構(gòu)體的指針,更多相關(guān)信息如上:
);
WH_CBT :安裝一個(gè)鉤子,臨視系統(tǒng)發(fā)送給窗口的基本信息(基于計(jì)算機(jī)培訓(xùn)的"鉤子"),更多信息如下:
LRESULT CALLBACK
CBTProc(
int nCode, //描述鉤子程序裝如何處理消息,如果 nCode 的值小于零 那么鉤子程序?qū)⑻^這個(gè)消息.返回調(diào)用 CallNextHookEx 得到的返回值,相關(guān)值的意義如下
WPARAM wParam, //相關(guān)信息參見返回值
LPARAM lParam //相關(guān)信息參見返回值
); //返回值為參數(shù)一相關(guān)的值
// nCode 的相關(guān)值
HCBT_ACTIVATE :系統(tǒng)正要激活一個(gè)窗口
HCBT_CLICKSKIPPED :系統(tǒng)已經(jīng)從消息隊(duì)列中刪除了鼠標(biāo)滾回消息,必須在安裝了 WH_JOURNALPLAYBACK 鉤子之后才會(huì)觸發(fā)該消息
HCBT_CREATEWND :一個(gè)窗口已經(jīng)被創(chuàng)建,系統(tǒng)會(huì)在發(fā)送 WM_CREATE 或 WM_NCCREATE 消息之前調(diào)用鉤子程序.如果鉤子程序
的返回值為非零,那么系統(tǒng)裝會(huì)銷毀這個(gè)窗口, CreateWindow 函數(shù)的返回值會(huì)為 NULL,但是 WM_DESTROY
消息不會(huì)發(fā)送給窗口,如果鉤子程序的返回值為零,那么窗口會(huì)被正常創(chuàng)建,在 HCBT_CREATEWND 被通知
的時(shí)候,這個(gè)窗口就已經(jīng)被創(chuàng)建了,但是它的大小和位置被有被指定,以及它的父窗口也沒有被指定.
HCBT_DESTROYWND :一個(gè)窗口已經(jīng)被銷毀
HCBT_KEYSKIPPED :系統(tǒng)已經(jīng)從消息隊(duì)列中刪除了鍵盤滾回消息,必須在安裝了 WH_JOURNALPLAYBACK 鉤子之后才會(huì)觸發(fā)該消息
HCBT_MINMAX :一個(gè)窗口已經(jīng)最小化或最大化了
HCBT_MOVESIZE :一個(gè)窗口已經(jīng)移動(dòng)了或改變了大小
HCBT_QS :一個(gè)窗口已經(jīng)從系統(tǒng)消息隊(duì)列中接受了 WM_QUEUESYNC 消息.
HCBT_SETFOCUS :一個(gè)窗口已經(jīng)被激活
HCBT_SYSCOMMAND :一個(gè)窗口已經(jīng)接受了系統(tǒng)命令
WH_DEBUG :安裝一個(gè)鉤子,鉤住安裝鉤子的程序(差錯(cuò)"鉤子"),更多信息如下:
LRESULT CALLBACK
DebugProc(
int nCode, //描述鉤子程序是否一定要處理這個(gè)消息 如果 nCode == HC_ACTION,那么鉤子程序一定要處理這個(gè)消息,如果 nCode 的值小于零,則一定要跳過這個(gè)消息
WPARAM wParam, //描述什么樣的鉤子被裝載了,參數(shù)值與 SetWindowsHookEx 函數(shù)的 idHook 參數(shù)值相同
LPARAM lParam //一個(gè)指向 DEBUGHOOKINFO 結(jié)構(gòu)體的指什,具體信息如下:
);
typedef struct {
DWORD idThread; //filter 線程的ID
DWORD idThreadInstaller; //debugging filter 線程的ID
LPARAM lParam; //描述跳過此鉤子程序要傳遞給Debug程序的 lParam
WPARAM wParam; //描述跳過此鉤子程序要傳遞給Debug程序的 wParam
int code; //描述跳過此鉤子程序要傳遵給Debug程序的 nCode
} DEBUGHOOKINFO, *PDEBUGHOOKINFO;
WH_FOREGROUNDIDLE :安裝一個(gè)鉤子,當(dāng)一個(gè)程序的前端線程改變?yōu)榈蛢?yōu)先級(jí)時(shí)調(diào)用鉤子程序,這個(gè)鉤子在一個(gè)任務(wù)被降低優(yōu)先級(jí)前工作(前臺(tái)空閑窗口"鉤子"),更多信息如下:
DWORD CALLBACK
ForegroundIdleProc(
int code, //描述鉤子程序是否一定要處理這個(gè)消息 如果 nCode == HC_ACTION,那么鉤子程序一定要處理這個(gè)消息,如果 nCode 的值小于零,則一定要跳過這個(gè)消息
DWORD wParam, //這個(gè)參數(shù)沒有用
LONG lParam //這個(gè)參數(shù)沒有用
);
WH_GETMESSAGE :安裝一個(gè)鉤子,監(jiān)視一個(gè)消息被寄送到了消息等待隊(duì)列中(接收消息投遞的"鉤子"),更多信息如下:
LRESULT CALLBACK
GetMsgProc(
int code, //描述鉤子程序是否一定要處理這個(gè)消息 如果 nCode == HC_ACTION,那么鉤子程序一定要處理這個(gè)消息,如果 nCode 的值小于零,則一定要跳過這個(gè)消息
WPARAM wParam, //描述這個(gè)消息是否被刪除了從消息隊(duì)列中 值為: PM_NOREMOVE :描述這個(gè)消息沒有從消息隊(duì)列中刪除(應(yīng)用程序調(diào)用了 PeekMessage )
PM_REMOVE :描述這個(gè)消息已經(jīng)從消息隊(duì)列中刪除(應(yīng)用程序調(diào)用了 GetMessage 或 PeekMessage)
LPARAM lParam //一個(gè)指向 MSG 結(jié)構(gòu)體的指針,,具體信息如下:
);
typedef struct {
HWND hwnd; //接受消息的窗體句柄
UINT message; //描述消息,應(yīng)用程序通常使用低位 WORD 值,操作系統(tǒng)通常使用高位 WORD 值
WPARAM wParam; //消息的附加消息
LPARAM lParam; //消息的附加消息
DWORD time; //消息的發(fā)送時(shí)間
POINT pt; //消息發(fā)送時(shí)的鼠標(biāo)指針位置
} MSG, *PMSG;
WH_JOURNALPLAYBACK :安裝一個(gè)鉤子,滾回一個(gè)鼠標(biāo)鍵盤的消息隊(duì)列,這個(gè)消息隊(duì)列是由 WH_JOURNALRECORD 鉤子創(chuàng)建的,更多信息如下:
LRESULT CALLBACK JournalPlaybackProc(
int code, //描述鉤子程序是否一定要處理這個(gè)消息 如果 nCode == HC_ACTION,那么鉤子程序一定要處理這個(gè)消息,如果 nCode 的值小于零,則一定要跳過這個(gè)消息
這個(gè)參數(shù)可能是以下值:
HC_GETNEXT :鉤子程序拷貝了當(dāng)前的鼠標(biāo)或鍵盤消息,它是一個(gè) EVENTMSG 結(jié)構(gòu)體,由 lParam 來傳遞指針
HC_NOREMOVE :應(yīng)用程序調(diào)用了 PeekMessage 函數(shù),且調(diào)用 PeekMessage 函數(shù)之后,消息沒有從系統(tǒng)消息隊(duì)列中被移除
HC_SKIP :鉤子程序準(zhǔn)備復(fù)制被 lParam 指向的 EVENTMSG 結(jié)構(gòu)下的鼠標(biāo)或鍵盤信息,一旦收到 HC_GETNEXT 鉤子程序復(fù)制
HC_SYSMODALOFF :一個(gè)消息框被銷毀,鉤子程序?qū)⒗^續(xù)開始滾回消息
HC_SYSMODALON :一個(gè)消息框被顯示出來,鉤子程序?qū)和L回消息,直到這個(gè)消息框被銷毀,鉤子程序才繼續(xù)開始滾回消息
WPARAM wParam, //無用的參數(shù)
LPARAM lParam //只有當(dāng) nCode 參數(shù)的值為 HC_GETNEXT ,它才是一個(gè)指向 EVENTMSG 結(jié)構(gòu)體的指針,否則是無用的參數(shù)
);
WH_JOURNALRECORD :安裝一個(gè)鉤子,記錄一個(gè)鼠標(biāo)鍵盤消息隊(duì)列,更多信息如下:
LRESULT CALLBACK
JournalRecordProc(
int code,//描述鉤子程序是否一定要處理這個(gè)消息 如果 nCode == HC_ACTION,那么鉤子程序一定要處理這個(gè)消息,如果 nCode 的值小于零,則一定要跳過這個(gè)消息
HC_SYSMODALOFF :一個(gè)消息框被銷毀,鉤子程序?qū)⒗^續(xù)開始滾回消息
HC_SYSMODALON :一個(gè)消息框被顯示出來,鉤子程序?qū)和L回消息,直到這個(gè)消息框被銷毀,鉤子程序才繼續(xù)開始滾回消息
WPARAM wParam,//這個(gè)參數(shù)是無效的
LPARAM lParam//一個(gè)指向 EVENTMSG 結(jié)構(gòu)體的指針變量
);
typedef struct {
UINT message; //描述消息
UINT paramL; //消息的擴(kuò)展信息
UINT paramH; //消息的擴(kuò)展信息
DWORD time; //寄送消息的時(shí)間
HWND hwnd; //接受消息的窗口句柄
} EVENTMSG, *PEVENTMSG;
WH_KEYBOARD :安裝一個(gè)鉤子:監(jiān)視鍵盤的消息,更多信息如下:
LRESULT CALLBACK KeyboardProc(
int code, //描述鉤子程序是否一定要處理這個(gè)消息 如果 nCode == HC_ACTION,那么鉤子程序一定要處理這個(gè)消息,如果 nCode 的值小于零,則一定要跳過這個(gè)消息
這個(gè)參數(shù)可能是以下值:
HC_ACTION :wParam 和 lParam 包涵了完整的消息
HC_NOREMOVE :wParam 和 lParam 包涵了完整的消息,且這個(gè)鍵盤消息沒有從系統(tǒng)消息隊(duì)列中刪除
WPARAM wParam, //描述鍵盤消息的虛擬鍵信息
LPARAM lParam //描述鍵盤消息的掃描碼信息
);
WH_KEYBOARD_LL :安裝一個(gè)鉤子:監(jiān)視鍵盤的低級(jí)消息(Windows NT/2000/XP),更多信息如下:
LRESULT CALLBACK LowLevelKeyboardProc(
int nCode, //描述鉤子程序是否一定要處理這個(gè)消息 如果 nCode == HC_ACTION,那么鉤子程序一定要處理這個(gè)消息,如果 nCode 的值小于零,則一定要跳過這個(gè)消息
HC_ACTION :wParam 和 lParam 包涵了完整的消息
WPARAM wParam, //描述了鍵盤的消息值:WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, 或 WM_SYSKEYUP.
LPARAM lParam //一個(gè)指向 KBDLLHOOKSTRUCT 結(jié)構(gòu)體的指針變量,更多信息如下:
);
typedef struct {
DWORD vkCode; //鍵盤消息的虛擬鍵信息,值的范圍從1至254
DWORD scanCode; //鍵盤的掃描碼信息
DWORD flags; //鍵盤的擴(kuò)展信息
DWORD time; //消息的產(chǎn)生時(shí)間,可以用 GetMessageTime 函數(shù)取得
ULONG_PTR dwExtraInfo; //消息的擴(kuò)展信息
} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
WH_MOUSE :安裝一個(gè)鉤子:監(jiān)視鍵盤的消息,更多信息如下:
LRESULT CALLBACK MouseProc(
int nCode, //描述鉤子程序是否一定要處理這個(gè)消息 如果 nCode == HC_ACTION,那么鉤子程序一定要處理這個(gè)消息,如果 nCode 的值小于零,則一定要跳過這個(gè)消息
這個(gè)參數(shù)可能是以下值:
HC_ACTION :wParam 和 lParam 包涵了完整的消息
HC_NOREMOVE :wParam 和 lParam 包涵了完整的消息,且這個(gè)鼠標(biāo)消息沒有從系統(tǒng)消息隊(duì)列中刪除
WPARAM wParam, //描述了鼠標(biāo)的消息值
LPARAM lParam //一個(gè)指向 MOUSEHOOKSTRUCT 結(jié)構(gòu)體的指針變量,更多信息如下:
);
typedef struct {
POINT pt; //發(fā)送鼠標(biāo)消息時(shí)候的鼠標(biāo)坐標(biāo)
HWND hwnd; //接收鼠標(biāo)消息的窗口句柄
UINT wHitTestCode; //測試碼
ULONG_PTR dwExtraInfo; //鼠標(biāo)消息的擴(kuò)展信息
} MOUSEHOOKSTRUCT, *PMOUSEHOOKSTRUCT;
WH_MOUSE_LL :安裝一個(gè)鉤子:監(jiān)視鼠標(biāo)的低級(jí)消息(Windows NT/2000/XP),更多信息如下:
LRESULT CALLBACK LowLevelMouseProc(
int nCode, //描述鉤子程序是否一定要處理這個(gè)消息 如果 nCode == HC_ACTION,那么鉤子程序一定要處理這個(gè)消息,如果 nCode 的值小于零,則一定要跳過這個(gè)消息
這個(gè)參數(shù)可能是以下值: HC_ACTION :wParam 和 lParam 包涵了完整的消息
WPARAM wParam, //描術(shù)了鼠標(biāo)的消息值: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_RBUTTONDOWN, 或 WM_RBUTTONUP.
LPARAM lParam //一個(gè)指向 MSLLHOOKSTRUCT 的指針變量,具體信息如下:
);
typedef struct {
POINT pt; //發(fā)送鼠標(biāo)消息時(shí)候的鼠標(biāo)坐標(biāo)
DWORD mouseData; //如果這個(gè)消息是 WM_MOUSEWHEEL 則高位為滾輪的滾動(dòng)數(shù)目,低位保留.如果這個(gè)消息是 WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLK,
WM_NCXBUTTONDOWN, WM_NCXBUTTONUP, 或 WM_NCXBUTTONDBLCLK.則高位描述的是X按鈕是按下還是釋放,低位保留
DWORD flags; //描述消息的注入事件
DWORD time; //描述寄送消息的時(shí)候
ULONG_PTR dwExtraInfo; //描述消息的擴(kuò)展信息
} MSLLHOOKSTRUCT, *PMSLLHOOKSTRUCT;
WH_MSGFILTER :安裝一個(gè)鉤子:監(jiān)視一些如同輸入框,消息框,菜單,滾動(dòng)條的事件(對話框、消息框、菜單或滾動(dòng)條輸入消息"鉤子"),更多信息如下:
LRESULT CALLBACK MessageProc(
int code, //描述鉤子程序是否一定要處理這個(gè)消息 如果 nCode == HC_ACTION,那么鉤子程序一定要處理這個(gè)消息,如果 nCode 的值小于零,則一定要跳過這個(gè)消息
這個(gè)參數(shù)可能是以下值: MSGF_DDEMGR :輸入框
MSGF_DIALOGBOX :消息框
MSGF_MENU :菜單
MSGF_SCROLLBAR :滾動(dòng)條
WPARAM wParam, //保留值
LPARAM lParam //一個(gè)指向 MSG 的指針變量,更多信息參見上面;
);
WH_SHELL :安裝一個(gè)鉤子:監(jiān)視對程序的 Shell 操作(外殼"鉤子"),更多信息如下:
LRESULT CALLBACK ShellProc(
int nCode, //描述鉤子程序是否一定要處理這個(gè)消息 如果 nCode == HC_ACTION,那么鉤子程序一定要處理這個(gè)消息,如果 nCode 的值小于零,則一定要跳過這個(gè)消息
這個(gè)參數(shù)可能是以下值:
HSHELL_ACCESSIBILITYSTATE :程序的訪問權(quán)被改變 (Windows 2000/XP)
HSHELL_ACTIVATESHELLWINDOW :Shell 操作將激活程序的主窗口
HSHELL_APPCOMMAND :用戶完成了輸入一個(gè)指令(例如按下了一個(gè)關(guān)鍵的按鈕或鍵)而且應(yīng)用程序沒有處理被產(chǎn)生的
WM_APPCOMMAND 消息.WM_APPCOMMAND值參見下面
wParam:按下或放開按鈕
lParam:
APPCOMMAND_BASS_BOOST :低音開關(guān)
APPCOMMAND_BASS_DOWN :減少低音
APPCOMMAND_BASS_UP :增加低音
APPCOMMAND_BROWSER_BACKWARD :瀏覽器-向前
APPCOMMAND_BROWSER_FAVORITES:瀏覽器-收藏夾
APPCOMMAND_BROWSER_FORWARD :瀏覽器-向后
APPCOMMAND_BROWSER_HOME :瀏覽器-主頁
APPCOMMAND_BROWSER_REFRESH :瀏覽器-刷新
APPCOMMAND_BROWSER_SEARCH :瀏覽器-搜索
APPCOMMAND_BROWSER_STOP :瀏覽器-停止下載
APPCOMMAND_CLOSE :關(guān)閉窗口(不是程序)
APPCOMMAND_COPY :復(fù)制已選擇
APPCOMMAND_CORRECTION_LIST :當(dāng)一個(gè)不正確的字符輸入時(shí),退出
APPCOMMAND_CUT :剪切已選擇
APPCOMMAND_DICTATE_OR_COMMAND_CONTROL_TOGGLE :輸入和控制狀態(tài)的互相改變
APPCOMMAND_FIND :打開查找對話框
APPCOMMAND_FORWARD_MAIL :向前瀏覽郵件
APPCOMMAND_HELP :打開幫助對話框
APPCOMMAND_LAUNCH_APP1 :打開應(yīng)用程序1
APPCOMMAND_LAUNCH_APP2 :打開應(yīng)用程序2
APPCOMMAND_LAUNCH_MAIL :打開郵件
APPCOMMAND_MEDIA_CHANNEL_DOWN :向下翻多媒體的頻道(Windows XP SP1)
APPCOMMAND_MEDIA_CHANNEL_UP :向上翻多媒體的頻道(Windows XP SP1)
APPCOMMAND_MEDIA_FASTFORWARD:回滾多媒體 (Windows XP SP1)
APPCOMMAND_MEDIA_NEXTTRACK :多媒體播放下一個(gè)文件
APPCOMMAND_MEDIA_PAUSE :多媒體暫停
APPCOMMAND_MEDIA_PLAY :多媒體播放
APPCOMMAND_MEDIA_PLAY_PAUSE :多媒體暫停/播放
APPCOMMAND_MEDIA_RECORD :多媒體開始記錄
APPCOMMAND_MEDIA_REWIND :回滾(???)
APPCOMMAND_MEDIA_SELECT :進(jìn)入多媒體選擇狀態(tài)
APPCOMMAND_MEDIA_STOP :多媒體停止
APPCOMMAND_MIC_ON_OFF_TOGGLE:開關(guān)麥克風(fēng)
APPCOMMAND_MICROPHONE_VOLUME_DOWN 麥克風(fēng)音量減小
APPCOMMAND_MICROPHONE_VOLUME_MUTE :關(guān)閉麥克風(fēng)
APPCOMMAND_MICROPHONE_VOLUME_UP :麥克風(fēng)音量加大
APPCOMMAND_NEW :創(chuàng)建一個(gè)新窗口
APPCOMMAND_OPEN :打開一個(gè)窗口
APPCOMMAND_PASTE :粘貼
APPCOMMAND_PRINT :打印
APPCOMMAND_REDO :重復(fù)最后的動(dòng)作
APPCOMMAND_REPLY_TO_MAIL :回復(fù)一個(gè)郵件信息
APPCOMMAND_SAVE :保存當(dāng)前的文檔
APPCOMMAND_SEND_MAIL :發(fā)送一個(gè)郵件
APPCOMMAND_SPELL_CHECK :開始Spell檢查
APPCOMMAND_TREBLE_DOWN :減小高音
APPCOMMAND_TREBLE_UP :增大高音
APPCOMMAND_UNDO :恢復(fù)最后的操作
APPCOMMAND_VOLUME_DOWN :增大音量
APPCOMMAND_VOLUME_MUTE :關(guān)閉音
APPCOMMAND_VOLUME_UP :減小音量
FAPPCOMMAND_KEY :用戶按下了一個(gè)鍵
FAPPCOMMAND_MOUSE :用戶按下了一個(gè)鼠標(biāo)按鈕
FAPPCOMMAND_OEM :未經(jīng)確認(rèn)的事件,可能是鼠標(biāo)事件或是鍵盤事件
MK_CONTROL :Ctrl鍵按下了
MK_LBUTTON :鼠標(biāo)左鍵按下了
MK_MBUTTON :鼠標(biāo)中鍵按下了
MK_RBUTTON :鼠標(biāo)右鍵按下了
MK_SHIFT :Shift鍵按下了
MK_XBUTTON1 :第一個(gè)X按鈕按下了
MK_XBUTTON2 :第二個(gè)X按鈕按下了
HSHELL_GETMINRECT :一個(gè)窗口取大化或最小化時(shí)系統(tǒng)需要它最小化后的窗口矩形
HSHELL_LANGUAGE :鍵盤語言改變
HSHELL_REDRAW :任務(wù)欄上的該窗口項(xiàng)重畫
HSHELL_TASKMAN :用戶選擇了任務(wù)欄中的一項(xiàng)
HSHELL_WINDOWACTIVATED :最前端的窗口改變了Z順序
HSHELL_WINDOWCREATED :一個(gè)最前端的窗口被創(chuàng)建,在調(diào)用鉤子函數(shù)的時(shí)候,該窗口已經(jīng)被創(chuàng)建
HSHELL_WINDOWDESTROYED :一個(gè)最前端的窗口被銷毀,在調(diào)用鉤子函數(shù)的時(shí)候,該窗口已經(jīng)被銷毀
HSHELL_WINDOWREPLACED :一個(gè)最前端的窗口被改變位置,在調(diào)用鉤子函數(shù)的時(shí)候,該窗口已經(jīng)被改變位置
WPARAM wParam, //該參數(shù)的值隨 nCode 參數(shù)的值改變而賦有不同的意義
nCode |值
HSHELL_ACCESSIBILITYSTATE |ACCESS_FILTERKEYS, ACCESS_MOUSEKEYS,或 ACCESS_STICKYKEYS.
HSHELL_APPCOMMAND |在上面已列出來了
HSHELL_GETMINRECT |窗口句柄
HSHELL_LANGUAGE |窗口句柄
HSHELL_REDRAW |窗口句柄
HSHELL_WINDOWACTIVATED |窗口句柄
HSHELL_WINDOWCREATED |窗口句柄
HSHELL_WINDOWDESTROYED |窗口句柄
HSHELL_WINDOWREPLACED |窗口句柄
LPARAM lParam //該參數(shù)的值隨 nCode 參數(shù)的值改變而賦有不同的意義
nCode |值
HSHELL_APPCOMMAND |
HSHELL_GETMINRECT |一個(gè)指向 RECT 的結(jié)構(gòu)體變量
HSHELL_LANGUAGE |鍵盤語言的句柄
HSHELL_REDRAW |TRUE:重畫,FALSE:別的方式
HSHELL_WINDOWACTIVATED |TRUE:全屏,FALSE:別的方式
HSHELL_WINDOWREPLACED |新的窗口句柄
); //返回值:如果正常調(diào)用,返回值為:0 如果 nCode 值為 HSHELL_APPCOMMAND 且Shell值
為 WM_COMMAND 則返回值為非零
WH_SYSMSGFILTER :安裝一個(gè)鉤子:監(jiān)視一些如同輸入框,消息框,菜單,滾動(dòng)條的系統(tǒng)事件(系統(tǒng)消息"鉤子"),更多信息如下:
LRESULT CALLBACK
SysMsgProc(
int code, //描述鉤子程序是否一定要處理這個(gè)消息 如果 nCode == HC_ACTION,那么鉤子程序一定要處理這個(gè)消息,如果 nCode 的值小于零,則一定要跳過這個(gè)消息
這個(gè)參數(shù)可能是以下值: MSGF_DDEMGR :輸入框
MSGF_DIALOGBOX :消息框
MSGF_MENU :菜單
MSGF_SCROLLBAR :滾動(dòng)條
WPARAM wParam, //保留值
LPARAM lParam //一個(gè)指向 MSG 的指針變量,更多信息參見上面;
);
*/
LRESULT CallNextHookEx( //調(diào)用下一個(gè)Hook
HHOOK hhk, //Hook句柄
int nCode, //照Hook函數(shù)的 nCode 函數(shù)輸入,具體見上
WPARAM wParam, //照Hook函數(shù)的 wParam 函數(shù)輸入,具體見上
LPARAM lParam //照Hook函數(shù)的 lParam 函數(shù)輸入,具體見上
); //
BOOL UnhookWindowsHookEx( //卸載掉鉤子
HHOOK hhk //Hook句柄
);
//////////////////////////////////////////////////////////////////////////////////
鉤子類型 每一種類型的Hook可以使應(yīng)用程序能夠監(jiān)視不同類型的系統(tǒng)消息處理機(jī)制。下面描述所有可以利用的Hook類型。
1、WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks
WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks使你可以監(jiān)視發(fā)送到窗口過程的消息。系統(tǒng)在消息發(fā)送到接收窗口過程之前調(diào)用WH_CALLWNDPROC Hook子程,并且在窗口過程處理完消息之后調(diào)用WH_CALLWNDPROCRET Hook子程。
WH_CALLWNDPROCRET Hook傳遞指針到CWPRETSTRUCT結(jié)構(gòu),再傳遞到Hook子程。
CWPRETSTRUCT結(jié)構(gòu)包含了來自處理消息的窗口過程的返回值,同樣也包括了與這個(gè)消息關(guān)聯(lián)的消息參數(shù)。
2、WH_CBT Hook
在以下事件之前,系統(tǒng)都會(huì)調(diào)用WH_CBT Hook子程,這些事件包括:
1. 激活,建立,銷毀,最小化,最大化,移動(dòng),改變尺寸等窗口事件;
2. 完成系統(tǒng)指令;
3. 來自系統(tǒng)消息隊(duì)列中的移動(dòng)鼠標(biāo),鍵盤事件;
4. 設(shè)置輸入焦點(diǎn)事件;
5. 同步系統(tǒng)消息隊(duì)列事件。
Hook子程的返回值確定系統(tǒng)是否允許或者防止這些操作中的一個(gè)。
3、WH_DEBUG Hook
在系統(tǒng)調(diào)用系統(tǒng)中與其他Hook關(guān)聯(lián)的Hook子程之前,系統(tǒng)會(huì)調(diào)用WH_DEBUG Hook子程。你可以使用這個(gè)Hook來決定是否允許系統(tǒng)調(diào)用與其他Hook關(guān)聯(lián)的Hook子程。
4、WH_FOREGROUNDIDLE Hook
當(dāng)應(yīng)用程序的前臺(tái)線程處于空閑狀態(tài)時(shí),可以使用WH_FOREGROUNDIDLE Hook執(zhí)行低優(yōu)先級(jí)的任務(wù)。當(dāng)應(yīng)用程序的前臺(tái)線程大概要變成空閑狀態(tài)時(shí),系統(tǒng)就會(huì)調(diào)用WH_FOREGROUNDIDLE Hook子程。
5、WH_GETMESSAGE Hook
應(yīng)用程序使用WH_GETMESSAGE Hook來監(jiān)視從GetMessage or PeekMessage函數(shù)返回的消息。你可以使用WH_GETMESSAGE Hook去監(jiān)視鼠標(biāo)和鍵盤輸入,以及其他發(fā)送到消息隊(duì)列中的消息。
6、WH_JOURNALPLAYBACK Hook
WH_JOURNALPLAYBACK Hook使應(yīng)用程序可以插入消息到系統(tǒng)消息隊(duì)列。可以使用這個(gè)Hook回放通過使用WH_JOURNALRECORD Hook記錄下來的連續(xù)的鼠標(biāo)和鍵盤事件。只要WH_JOURNALPLAYBACK Hook已經(jīng)安裝,正常的鼠標(biāo)和鍵盤事件就是無效的。
WH_JOURNALPLAYBACK Hook是全局Hook,它不能象線程特定Hook一樣使用。
WH_JOURNALPLAYBACK Hook返回超時(shí)值,這個(gè)值告訴系統(tǒng)在處理來自回放Hook當(dāng)前消息之前需要等待多長時(shí)間(毫秒)。這就使Hook可以控制實(shí)時(shí)事件的回放。
WH_JOURNALPLAYBACK是system-wide local hooks,它??不??射到任何行程位址空駣??
7、WH_JOURNALRECORD Hook
WH_JOURNALRECORD Hook用來監(jiān)視和記錄輸入事件。典型的,可以使用這個(gè)Hook記錄連續(xù)的鼠標(biāo)和鍵盤事件,然后通過使用WH_JOURNALPLAYBACK Hook來回放。
WH_JOURNALRECORD Hook是全局Hook,它不能象線程特定Hook一樣使用。
WH_JOURNALRECORD是system-wide local hooks,它??不??射到任何行程位址空駣??
8、WH_KEYBOARD Hook
在應(yīng)用程序中,WH_KEYBOARD Hook用來監(jiān)視WM_KEYDOWN and WM_KEYUP消息,這些消息通過GetMessage or PeekMessage function返回。可以使用這個(gè)Hook來監(jiān)視輸入到消息隊(duì)列中的鍵盤消息。
9、WH_KEYBOARD_LL Hook
WH_KEYBOARD_LL Hook監(jiān)視輸入到線程消息隊(duì)列中的鍵盤消息。
10、WH_MOUSE Hook
WH_MOUSE Hook監(jiān)視從GetMessage 或者 PeekMessage 函數(shù)返回的鼠標(biāo)消息。使用這個(gè)Hook監(jiān)視輸入到消息隊(duì)列中的鼠標(biāo)消息。
11、WH_MOUSE_LL Hook
WH_MOUSE_LL Hook監(jiān)視輸入到線程消息隊(duì)列中的鼠標(biāo)消息。
12、WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks
WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks使我們可以監(jiān)視菜單,滾動(dòng)條,消息框,對話框消息并且發(fā)現(xiàn)用戶使用ALT+TAB or ALT+ESC 組合鍵切換窗口。WH_MSGFILTER Hook只能監(jiān)視傳遞到菜單,滾動(dòng)條,消息框的消息,以及傳遞到通過安裝了Hook子程的應(yīng)用程序建立的對話框的消息。WH_SYSMSGFILTER Hook監(jiān)視所有應(yīng)用程序消息。
WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks使我們可以在模式循環(huán)期間過濾消息,這等價(jià)于在主消息循環(huán)中過濾消息。
通過調(diào)用CallMsgFilter function可以直接的調(diào)用WH_MSGFILTER Hook。通過使用這個(gè)函數(shù),應(yīng)用程序能夠在模式循環(huán)期間使用相同的代碼去過濾消息,如同在主消息循環(huán)里一樣。
13、WH_SHELL Hook
外殼應(yīng)用程序可以使用WH_SHELL Hook去接收重要的通知。當(dāng)外殼應(yīng)用程序是激活的并且當(dāng)頂層窗口建立或者銷毀時(shí),系統(tǒng)調(diào)用WH_SHELL Hook子程。
WH_SHELL 共有5鐘情?r:
1. 只要有個(gè)top-level、unowned 窗口被產(chǎn)生、起作用、或是被摧毀;
2. 當(dāng)Taskbar需要重畫某個(gè)按鈕;
3. 當(dāng)系統(tǒng)需要顯示關(guān)于Taskbar的一個(gè)程序的最小化形式;
4. 當(dāng)目前的鍵盤布局狀態(tài)改變;
5. 當(dāng)使用者按Ctrl+Esc去執(zhí)行Task Manager(或相同級(jí)別的程序)。
按照慣例,外殼應(yīng)用程序都不接收WH_SHELL消息。所以,在應(yīng)用程序能夠接收WH_SHELL消息之前,應(yīng)用程序必須調(diào)用SystemParametersInfo function注冊它自己。