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