天天看點

各種鈎子函數詳解

鈎子類型

每一種類型的hook可以使應用程式能夠監視不同類型的系統消息處理機制。下面描述所有可以利用的hook類型。

1、wh_callwndproc和wh_callwndprocret hooks

wh_callwndproc和wh_callwndprocrethooks使你可以監視發送到視窗過程的消息。系統在消息發送到接收視窗過程之前調用wh_callwndprochook子程,并且在視窗過程處理完消息之後調用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_debughook子程。你可以使用這個hook來決定是否允許系統調用與其他hook關聯的hook子程。

4、wh_foregroundidle hook

當應用程式的前台線程處于空閑狀态時,可以使用wh_foregroundidlehook執行低優先級的任務。當應用程式的前台線程大概要變成空閑狀态時,系統就會調用wh_foregroundidlehook子程。

5、wh_getmessage hook

應用程式使用wh_getmessage hook來監視從getmessage orpeekmessage函數傳回的消息。你可以使用wh_getmessagehook去監視滑鼠和鍵盤輸入,以及其他發送到消息隊列中的消息。

6、wh_journalplayback hook

wh_journalplaybackhook使應用程式可以插入消息到系統消息隊列。可以使用這個hook回放通過使用wh_journalrecordhook記錄下來的連續的滑鼠和鍵盤事件。隻要wh_journalplaybackhook已經安裝,正常的滑鼠和鍵盤事件就是無效的。

wh_journalplayback hook是全局hook,它不能象線程特定hook一樣使用。

wh_journalplaybackhook傳回逾時值,這個值告訴系統在處理來自回放hook目前消息之前需要等待多長時間(毫秒)。這就使hook可以控制實時事件的回放。

wh_journalplayback是system-wide localhooks,它??不??射到任何行程位址空駣??

7、wh_journalrecord hook

wh_journalrecordhook用來監視和記錄輸入事件。典型的,可以使用這個hook記錄連續的滑鼠和鍵盤事件,然後通過使用wh_journalplaybackhook來回放。

wh_journalrecord hook是全局hook,它不能象線程特定hook一樣使用。

wh_journalrecord是system-wide local hooks,它??不??射到任何行程位址空駣??

8、wh_keyboard hook

在應用程式中,wh_keyboard hook用來監視wm_keydown andwm_keyup消息,這些消息通過getmessage or peekmessagefunction傳回。可以使用這個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_sysmsgfilterhooks使我們可以監視菜單,滾動條,消息框,對話框消息并且發現使用者使用alt+tab or alt+esc組合鍵切換視窗。wh_msgfilterhook隻能監視傳遞到菜單,滾動條,消息框的消息,以及傳遞到通過安裝了hook子程的應用程式建立的對話框的消息。wh_sysmsgfilterhook監視所有應用程式消息。

wh_msgfilter 和 wh_sysmsgfilterhooks使我們可以在模式循環期間過濾消息,這等價于在主消息循環中過濾消息。

通過調用callmsgfilter function可以直接的調用wh_msgfilterhook。通過使用這個函數,應用程式能夠在模式循環期間使用相同的代碼去過濾消息,如同在主消息循環裡一樣。

13、wh_shell hook

外殼應用程式可以使用wh_shellhook去接收重要的通知。當外殼應用程式是激活的并且當頂層視窗建立或者銷毀時,系統調用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消息之前,應用程式必須調用systemparametersinfofunction注冊它自己。

函數原形:

[cpp] view plaincopyprint?

lresult callback shellproc( int ncode, wparam wparam,lparam lparam );  

函數功能:

挂鈎處理過程是應用程式或庫中定義的回調函數,它與函數 setwindowshookex搭配使用.此函數從系統接受外殼(shell)通知.類型hookproc定義了指向此類回調函數的指針.shellproc時應用程式或庫中定義的相應回調的位置标志符.

參數:

ncode:

訓示挂鈎類型,該參數可以是以下值之一:

hshell_accessibilitystate: 對windows nt5.0或以上版本有效,訓示"可通路性"已被改變.

hshell_activateshellwindow: shell應當激活其主視窗.

hshell_getminrect: windows 95 only: 一個視窗正在被最小化或者最大化,系統需要該視窗被最小化時的矩形坐标.

hshell_language : windows 95 only: 鍵盤語言被改變或者一個新的鍵盤布局被加載.

hshell_redraw: windows 95 only: 一個視窗在任務條上的标題已被重畫.

hshell_taskman: windows 95 only: 使用者已選擇其任務清單.一個提供了任務的清單的shell應用程式當傳回true,以阻止windows開始(執行)其任務清單.

hshell_windowactivated: windows 95 only: 激活狀态已被轉移給一個不同的頂層無屬性主視窗.

hshell_windowcreated: 一個頂層無屬性主視窗已被建立.當系統調用一個sheproc函數時,該視窗存在.

hshell_windowdestroyed:一個頂層無屬性主視窗即将銷毀.當系統調用sheproc 函數時.該視窗仍然存在.

若ncode的值小于0,則此挂鈎處理過程必須将該消息不加處理地傳送給函數callnexthookex 并傳回其傳回值.

wparam: 

此參數的值依賴于參數ncode,其依賴關系如下所示:

hshell_accessibilitystate: 訓示哪一個可以通路特征已被改變了狀态,可以是以下值之一:

access_filterkys,access_mousekeys,access_stickkeys.

hshell_getminrect:被最小化或者最大化的視窗句柄.hshell_language: 視窗的句柄.

hshell_redraw:被重畫的視窗的句柄.hshell_windowactivated:被激活的視窗的句柄.

hshell_windowcreated:被建立的視窗的句柄.hshell_windowdestroyed:被銷毀的視窗的句柄.

lparam:

hshell_getminrect:指向該rect結構的指針.hshell_language: 鍵盤布局的句柄.

hshell_redraw: 若該視窗正在閃現,則其值為true,否則為false.

hshell_windowactivated: 若該視窗是全屏模式,則其值為true,否則為false.傳回值:傳回值應為0.

備注:

此挂鈎處理過程通過調用函數setwindowshookex ,指定wh_shll挂鈎類型及其相應挂鈎處理過程首位址來安裝.

lresult callback sysmsgproc(int ncode,wparam wparam,lparam lparam);    

挂鈎處理過程是應用程式或庫中定義的回調函數,它與函數 setwindowshookex搭配使用.當一個對話框、消息框、菜單條、或滾動條中的輸入事件發生,且由此引發的消息尚未被處理之前,系統對此挂鈎處理過程進行調用.此函數可以對系統中所有的對話框、消息框、菜單條、或滾動條消息進行監視.

類型hookproc定義了指向此類回調函數的指針.sysmsgproc 是庫中相應回調函數名的位置标志符.

訓示産生此消息的輸入事件類型.此參數可以是以下值之一:

msgf_dialogbox: 輸入事件由一個消息框或者對話框産生.

msgf_menu: 輸入事件由一個菜單條産生.

msgf_scrollbar: 輸入事件由一個滾動條産生.

msgf_nextwindow: 輸入事件由于使用者摁下組合鍵<alt+tab>以激活另一個視窗而産生.

若ncode的值小于0,則此挂鈎處理過程必須将該消息不加處理地傳送給函數 callnexthookex 并傳回其傳回值.

wparam:

為null(0).

指向msg結構的[指針].

傳回值:若ncode的值小于0,則此挂鈎處理過程必須傳回callnexthookex 的傳回值.若ncode的值大于或等于0,并且此挂鈎處理過程未對該消息進行處理,則調用函數callnexthookex 并傳回其傳回值是被推薦的.否則,其他安裝了wh_sysmsgfilter挂鈎的應用程式将無法收到此挂鈎通知,并可能由此導緻錯誤的行為.若此挂鈎處理過程處理了此消息,它應傳回一個非零值以避免系統再将此消息傳送給目标視窗處理過程.

備注:一個應用程式通過調用函數setwindowshookex 指定 wh_sysmsgfilter挂鈎類型及相應挂鈎處理過程首位址來安裝此挂鈎.

函數原形:

bool callmsgfilter(lpmsg lpmsg, int ncode);   

該函數将特定消息和挂鈎代碼發送給與挂鈎 wh_sysmsgfilter和wh_msgfilter 相聯系的挂鈎處理過程,一個 wh_sysmsgfilter 或者 wh_msgfilter挂鈎處理過程是指應用程式定義的回調函數,這些回調函數負責檢查,并可有選擇地修改關于對話框、消息框、菜單條、滾動條的消息。

參數:

lpmsg:

指向一個msg結構,該結構包含發送給挂鈎處理過程的消息.

指定挂鈎處理過程需要使用的應用程式定義的代碼,以确定如何對消息進行處理,該代碼切忌采用與系統預定義的與wh_sysmsgfilter和wh_msgfilter挂鈎相關的挂鈎代碼(msgf_ 和 hc_開頭)相同的值.

傳回值:

若該應用程式可對消息作進一步處理,則傳回值為0,若該應用程式不能對該消息作進一步處理,則傳回值為非0值.

備注:系統對callmsgfilter進行調用,以使得應用程式能夠檢查和控制在對對話框、消息框、菜單條、滾動條的内部處理過程中産生的,或是由使用者按下<alt+tab>組合鍵以激活不同視窗時産生的消息流.

可通過調用函數setwindowshookex來安裝此挂鈎處理過程.

lresult callback callwndproc(int ncode,wparam wparam,lparam lparam );  

該函數挂鈎處理過程是由應用程式定義或由庫定義的回調函數,它與函數 setwindowshookex配套使用,系統調用此函數無論何時一旦函數 sendmessage被調用,在将消息發送至相應的視窗處理過程之前,系統先将該消息發送至挂鈎處理過程,該挂鈎處理過程可以對改消息進行檢查,但不能修改之.

類型hookproc定義了指向此類回調函數的指針,callwndproc是應用程式定義或庫定義的函數名的位置标志位.

指定該挂鈎處理過程是否必須對該消息進行處理,若ncode 是hc_action,則該挂鈎處理過程必須處理該消息.若ncode的值小于0,則此挂鈎處理過程必須在未對該消息作進一步處理的情況下,将其發送給函數 callnexthookex并傳回由 callnexthookex傳回的值.

訓示該消息是否由目前線程發出,若該消息由目前線程發出,其值為非0值,否則,其值為0.

指向一個cwpstruct結構,該結構包含了此消息的詳細消息.

若ncode的值小于0,則此挂鈎函數必須傳回函數callnexthookex所傳回的值;若ncode的值大于或等于0,我們極力推薦對函數callnexthookex進行調用,并傳回其傳回值.否則,其他安裝了wm_callwndproc挂鈎的應用程式将無法收到挂鈎通知,進而導緻錯誤的行為.若此挂鈎沒有調用函數callnexthookex,則傳回值為0.

備注:挂鈎處理函數callwndpro可以對消息進行檢查,但不能修改之.在該挂鈎處理過程将控制傳回給系統之後,該消息被發送至相應的視窗過程.

一個應用程式通過調用setwindowshookex時指定wm_callwndproc挂鈎類型及其相應挂鈎處理過程的首位址來安裝挂鈎處理過程.

挂鈎wm_callwndproc是在調用函數sendmessage的線程中被調用的,它并非在接受消息的線程中被調用.

lresult callback callwndretproc(int ncode,wparam wparam,lparam lparam);  

該函數挂鈎處理過程是在應用程式或庫中定義的回調函數,它與函數 setwindowshookex搭配使用,系統将在調用完 sendmessage之後調用之,該挂鈎處理過程可以檢查該消息,但不能修改之.

類型hookproc定義了一類指針指向此類回調函數,callwndretproc 僅僅是在應用程式或庫中定義的相應函數名的位置标志符.

指定該挂鈎處理過程是否必須對該消息進行處理,若ncode 是hc_action,則該挂鈎處理過程必須處理該消息.若ncode的值小于0,則此挂鈎處理過程必須不加處理的将其發送給函數callnexthookex并傳回由 callnexthookex傳回的值.

若ncode的值小于0,則此挂鈎函數必須傳回函數callnexthookex所傳回的值;若ncode的值大于或等于0,我們極力推薦對函數callnexthookex進行調用,并傳回其傳回值.否則,其他安裝了挂鈎wm_callwndprocret的應用程式将無法收到挂鈎通知,進而導緻錯誤的行為.若此挂鈎處理過程沒有調用函數callnexthookex,則傳回值為0.

備注: 一個應用程式通過調用setwindowshookex時指定wm_callwndprocret挂鈎類型及其相應挂鈎處理過程的首位址來安裝挂鈎處理過程.

lresult callback cbtproc(int ncode,wparam wparam,lparam lparam);  

該函數挂鈎處理過程是在應用程式或庫中定義的回調函數,它與函數 setwindowshookex配套使用,系統在緝獲、建立、銷毀、最小化、最大化、移動或改變一個視窗尺寸之前調用它;在結束一個系統指令之前調用它;在将一個滑鼠或鍵盤事件從系統事件隊列中删除之前調用它;在設定鍵盤焦點之前調用它,或在與系統消息隊列進行同步之前調用它,一個基于計算機教育訓練(cbt)的應用程式使用此挂鈎處理過程來從系統接收有用的通知.

類型hookproc定義了指向此類回調函數的指針,cbtproc是應用程式定義或庫定義的相應回調函數名的位置辨別符.

指定一個代碼,該代碼被此挂鈎處理過程用來決定如何處理此消息,該參數可以是下值中的一個:

hcbt_activate: 系統将要激活一個視窗.

hcbt_clickskipped: 系統已經從系統消息隊列中删除了一個滑鼠消息,依據收到的這一挂鈎代碼,一個cbt應用程式必須安裝一個 wh_journalplayback 挂鈎處理過程以響應此滑鼠消息.

hcbt_createwnd:一個視窗将要被建立,系統在發送wm_create 或wm_nccreate消息至相應視窗之前調用該挂鈎處理過程.若該挂鈎處理過程傳回一個非0值,則系統銷毀該視窗,函數createwindow傳回值為null(0),但消息wm_destroy不會被發送至相應視窗,若挂鈎處理過程傳回為零,視窗将被正常建立.

當hcbt_createwnd通知發出之時,相應視窗已被建立,但其最終尺寸及位置可能尚未确定,其父視窗也可能還尚未被建立,存在這樣一種可能,消息被發送給新被建立的視窗,雖然該視窗尚未接收到wm_nccreate 或 wm_create 消息.也可能通過對cbt_createwnd結構的hwndinsertafter域的修改,來改變新被建立視窗在z序列中的位置.

hcbt_destroywnd:一個視窗将被銷毀.

hcbt_keyskipped:系統已從系統消息隊列中删除了一個鍵盤消息,依據收到的這個挂鈎代碼,一個cbt應用程式必須安裝一個 wh_journalplayback挂鈎處理過程以響應相應的鍵盤消息.

hcbt_minmax: 一個視窗将被最小化或最大化.

hcbt_movesize: 一個視窗将被移動或改變尺寸.

hcbt_qs: 系統已從系統消息隊列中取到一個wm_queuesync 消息.

hcbt_setfocus: 一個視窗将要獲得鍵盤焦點. 

hcbt_syscommand: 一個系統指令将被執行.這使得一個cbt應用程式可以避免因熱鍵響應而進行任務切換.

若ncode的值小于0,此挂鈎處理過程必須不加處理地将此消息發送給函數callnexthookex,并傳回函數callnexthookex的傳回值.

取決于參數ncode的值,詳細資訊參見以下的說明部分.

此挂鈎處理過程的傳回值決定了系統允許或禁止以下操作之一,對于與以下挂鈎代碼相應的操作,傳回值為0則允許這樣的操作,傳回值為1則禁止.

hcbt_activate

hcbt_createwndhcbt_destroywnd

hcbt_minmax

hcbt_movesizehcbt_setfocus

hcbt_syscommand

對于與以下cbt挂鈎代碼相對應的操作,傳回值被忽略.

hcbt_clickskipped

hcbt_keyskipped

hcbt_qs

除以下挂鈎代碼之外,不應當安裝wh_journalplayback挂鈎處理過程.

此挂鈎處理過程必須放在某個動态連結庫中,一個應用程式通過調用函數 setwindowshookex指定wh_cbt 挂鈎類型與相應挂鈎處理過程首位址來安裝挂鈎處理過程.

以下列示了參數wparam和lparam與每一種hcbt挂鈎代碼的關系.

指定一個長指針指向結構cbtactivatestruct 的長指針,該結構包含了指向激活視窗的句柄,并訓示被激活者是否由于點選而發生改變.

 值                            參數wparam       參數lparam 

hcbt_activate   指定将要被激活的視窗句柄.

指定一個指向結構mousehookstruct的長指針,該結構包含點選測試代碼及 滑鼠消息發往的視窗句柄.hcbt_ clickskipped 值僅當一個wh_mouse挂鈎被安裝了之時才發送一個cbtproc挂鈎處理過程,關于點選 測試代碼的清單,參見 wm_nchittest.

hcbt_clickskipped  辨別滑鼠消息從系統消息隊列中被删除.

指定一個指向 cbt_createwnd結構的長指針,該結構包含視窗的初始化參數,這些參數包括視窗的坐标和尺寸,通過改變這些參數.一個cbtproc挂鈎處理過程能夠設定視窗的初始尺寸和位置.

hcbt_createwnd 指定新視窗的句柄.

hcbt_destroywnd  指定将被銷毀的視窗句柄.     未定義,必須設定為0.

訓示重複次數,掃描碼,鍵轉義碼,前驅鍵狀态和上下文代碼.僅當wh_keyboard挂鈎被安裝了之時,此hcbt_keyskipped值被發送 cbtproc 挂鈎處理過程.欲獲得更多資訊,參見 wm_keyup 或wm_keydown

hcbt_keyskipped 訓示虛拟鍵的代碼.

低"字"部分指定一個顯示視窗的值(sw_),以指定相應操作,詳情參見showwindow,高"字"部分未定義.

hcbt_minmax 指定被最小化或最大化的視窗句柄  

指定一個指向rect結構的長指針,該結構包含視窗的坐标,通過改變結構的值,一個cbtproc的子處理過程能夠設定視窗的最終位置.

hcbt_movesize 指定将被移動或改變尺寸的視窗句柄.

hcbt_qs 未定義,必須設定為0 未定義,必須設定為0

hcbt_setfocus 指定獲得鍵盤焦點的視窗句柄. 訓示失去鍵盤焦點的視窗句柄.

訓示系統指令的值(sc_)以辨別相應系統指令,欲知更多關于系統指令值的資訊,參見wm_syscommand.

包含與wm_syscommand消息的lparam值相同的資料.若一個系統菜單指令被滑鼠選種,則低"字"部分包含光标在螢幕坐标系中的x坐标值,高"字"部分包含y坐标值,其他情況下,此參數未被使用.

類型hookproc定義了一類指針指向此類回調函數,cbtproc 僅僅是在應用程式或庫中定義的相應函數名的位置辨別符.

lresult callback debugproc(int ncode,wparam wparam,lparam lparam);  

該挂鈎處理過程是應用程式或庫中定義的回調函數,它與函數setwindowshookex搭配使用,系統在調用與任何挂鈎類型和相關的挂鈎處理過程之前調用它,系統傳送關于被調用的挂鈎的資訊給debugproc挂鈎處理過程,此挂鈎處理過程檢查上述資訊,并決定該挂鈎是否被調用.

類型hookproc定義了指向此類回調函數的指針, debugproc是應用程式定義或庫定義的相應回調函數名的位置辨別符.

訓示挂鈎處理過程是否必須處理此消息.若ncode的值是hc_action,則挂鈎處理過程必須處理此消息,若ncode之值小于0,此挂鈎處理過程必須将此消息不加處理地傳送給函數callnexthookex并傳回其傳回值.

訓示将被調用的挂鈎類型,此參數可以為以下值:

wh_callwndproc: 安裝一個監視發送至目标視窗處理過程之的消息的挂鈎處理過程,對該消息進行,詳情參見callwndproc挂鈎處理過程.

wh_callwndprocret :安裝一個挂鈎處理過程,以監視已剛被目标視窗處理過程處理過了的消息,詳情參見 callwndretproc 挂鈎處理過程.

wh_cbt :安裝一個挂鈎處理過程,接受對cbt應用程式有用的消息 ,詳情參見 cbtproc 挂鈎處理過程.

wh_debug:安裝一個挂鈎處理過程以便對其他挂鈎處理過程進行調試, 詳情參見debugproc挂鈎處理過程.

wh_foregroundidle:安裝一個挂鈎處理過程,該挂鈎處理過程當應用程式的前台線程即将進入空閑狀态時被調用,它有助于在空閑時間内執行低優先級的任務.

wh_getmessage:安裝一個挂鈎處理過程對寄送至消息隊列的消息進行監視,詳情參見 getmsgproc 挂鈎處理過程.

wh_journalplayback:安裝一個挂鈎處理過程,對此前由wh_journalrecord 挂鈎處理過程紀錄的消息進行寄送.詳情參見 journalplaybackproc挂鈎處理過程.

wh_journalrecord:安裝一個挂鈎處理過程,對寄送至系統消息隊列的輸入消息進行紀錄.詳情參見journalrecordproc挂鈎處理過程.

wh_keyboard:安裝一個挂鈎處理過程對擊鍵消息進行監視. 詳情參見keyboardproc挂鈎處理過程.

wh_mouse:安裝一個挂鈎處理過程,對滑鼠消息進行監視. 詳情參見 mouseproc挂鈎處理過程.

wh_msgfilter:安裝一個挂鈎處理過程, 以監視由對話框、消息框、菜單條、或滾動條中的輸入事件引發的消息.詳情參見messageproc挂鈎處理過程.

wh_shell:安裝一個挂鈎處理過程以接受對外殼應用程式有用的通知, 詳情參見 shellproc挂鈎處理過程.

wh_sysmsgfilter:安裝一個挂鈎處理過程,以監視由對話框、消息框、菜單條、或滾動條中的輸入事件引發的消息.這個挂鈎處理過程對系統中所有應用程式的這類消息都進行監視.詳情參見 sysmsgproc挂鈎處理過程.

指向一個debughookinfo結構,該結構包含希望被傳送給相應挂鈎處理過程的參數,為避免系統調用此挂鈎,此挂鈎處理過程必須傳回一非0值,否則,此挂鈎處理過程必須調用函數callnexthookex.

一個應用程式通過調用函數 setwindowshookex指定 wh_debug 挂鈎類型與相應挂鈎處理過程首位址來安裝此挂鈎處理過程.

dword foregroundidleproc(int code,dword wparam,long lparam);  

該函數處理過程是應用程式或庫定義的回調函數, 它與函數setwindowshookex搭配使用,系統在前台線程進入空閑狀态之前調用此函數.

類型hookproc定義了指向此類回調函數的指針, foregroundidleproc是應用程式定義或庫定義的相應回調函數名的位置辨別符.

code:

訓示此挂鈎處理過程是否必須處理消息, 若ncode的值是hc_action,則挂鈎處理過程必須處理此消息,若ncode之值小于0,則此挂鈎處理過程必須将此消息不加處理地傳送給函數callnexthookex并傳回其傳回值.

未被使用.

若ncode的值小于0,則此挂鈎函數必須傳回函數callnexthookex所傳回的值;若ncode的值大于或等于0,我們極力推薦對函數callnexthookex進行調用,并傳回其傳回值.否則,其他安裝了挂鈎wh_foregroundidle的應用程式将無法收到挂鈎通知,進而導緻錯誤的行為.若此挂鈎處理過程沒有調用函數callnexthookex,則傳回值為0.

lresult callback getmsgproc(int code,wparam wparam,lparam lparam );  

該函數處理過程是應用程式或庫定義的回調函數, 它與函數setwindowshookex搭配使用,每當函數getmessage從應用程式的消息隊列中獲得了一個消息時,系統就調用此函數,在将此獲得的消息傳送給相應視窗處理過程之前,系統将此消息傳送給該挂鈎處理過程.

類型hookproc定義了指向此類回調函數的指針, getmsgproc是應用程式定義或庫定義的相應回調函數名的位置辨別符.

訓示此消息是否已從消息隊列中被删除,此參數可以是以下值之一:

pm_noremove :指出該消息尚未從消息隊列中被删除(一個應用程式調用函數peekmessage ,設定pm_noremove 标志).

pm_remove: 指出該消息已從消息隊列中被删除. (一個應用程式調用函數 getmessage或peekmessage, 設定 pm_remove标志.)

指向結構msg,該結構包含了關于此消息的詳細消息

若ncode的值小于0,則此挂鈎函數必須傳回函數callnexthookex所傳回的值;若ncode的值大于或等于0,我們極力推薦對函數callnexthookex進行調用,并傳回其傳回值.否則,其他安裝了挂鈎wm_getmessage的應用程式将無法收到挂鈎通知,進而導緻錯誤的行為.若此挂鈎處理過程沒有調用函數callnexthookex,則傳回值為0.

挂鈎處理過程getmsgproc可以檢查和修改此消息,在此挂鈎處理過程将控制傳回給系統之後,函數getmessage将此修改後的消息傳回給最初調用他的應用程式,應用程式通過調用函數setwindowshookex指定wh_getmessage挂鈎類型和相應挂鈎處理過程的首位址來安裝此挂鈎處理過程.

lresult callback journalplaybackproc(int code, wparam wparam, lparam lparam);  

該函數處理過程是應用程式或庫定義的回調函數, 它與函數setwindowshookex搭配使用.典型地,一個應用程式通過調用此函數來對先前有journalrecordproc挂鈎處理過程紀錄的一系列滑鼠和鍵盤消息進行回放.一旦挂鈎函數journalplaybackproc挂鈎處理過程被安裝,則通常的滑鼠和鍵盤輸入被禁止.

類型hookproc定義了指向此類回調函數的指針, journalplaybackproc是應用程式定義或庫定義的相應回調函數名的位置辨別符.

訓示一個代碼,被挂鈎處理過程用來決定如何處理此消息,這個參數可以是以下值之一:

hc_getnext 挂鈎處理過程必須将目前的滑鼠或鍵盤消息拷貝至由參數lparam 所指結構eventmsg中. hc_noremove 一個正用wremovemsg為參數調用了 peekmessage的應用程式對pm_noremove标志進行設定,訓示此消息在經過函數peekmessage的處理之後,并不從消息隊列中被删除.

hc_skip此挂鈎處理過程必須準備拷貝下一個滑鼠或鍵盤消息至由參數lparam 所指定的結構eventmsg 中去,依據收到的代碼hc_getnext ,此挂鈎處理過程必須将消息拷貝至結構eventmsg 中去. hc_sysmodaloff 一個的有系統模式對話框已被銷毀,此挂鈎處理過程必須恢複對此消息的回調.

hc_sysmodalon 一個的有系統模式對話框正在被顯示,直至此對話礦被銷毀之前,此挂鈎處理過程必須停止對消息的回調.

若ncode的值小于0,則此挂鈎函數必須傳回函數callnexthookex所傳回的值.

訓示一個null(0)值

指向一個eventmsg結構,該結構反映了正被此挂鈎處理函數處理的消息,這個參數僅當參數ncode的值是hc_getnext時才有效.

為使系統在處理此消息之前先等待一段時間,傳回值必須為一個以時鐘計的時間量,該時間量指出了系統的等待時間長短.(此時間量可通過計算目前輸入的消息與上一個輸入消息的time成員的差别獲得),若希望立即處理此消息,傳回值應為0,此傳回值僅當挂鈎代碼為hc_getnext時才被使用,否則,此傳回值被忽略.

一個journalplaybackproc挂鈎處理過程應當将輸入消息拷貝給lparam參數,此消息必須是在先前使用journalrecordproc 挂鈎處理過程時被紀錄過的,在使用journalrecordproc挂鈎處理過程時,不應對此消息進行修改,為了多次獲得相同的消息,此挂鈎處理過程可以多次以hc_getnext為參數被調用.

若ncode的值為hc_getnext而傳回值大于0,則系統按傳回值指定的毫秒值進入睡眠狀态,當系統開始繼續執行時,它會以hc_getnext為參數ncode的值再次調用次挂鈎處理過程以獲得相同的消息,此次調用journalplaybackproc的傳回值為0,否則,系統又将回到睡眠狀态,并以此次調用journalplaybackproc傳回的毫秒數為睡眠時間,睡眠時間到後再重複上述操作.這就使得系統表現為被挂起.

與其餘大多數全局挂鈎處理過程不同,挂鈎處理過程journalrecordproc和journalplaybackproc總是在設定了該挂鈎的線程上下文中被調用.

在此挂鈎處理過程将控制傳回給系統後,此消息繼續被處理.若ncode的值為hc_skip,則此挂鈎處理過程必須準備在它下一次被調用時傳回下一個紀錄了的事件消息,安裝journalplaybackproc挂鈎處理過程通過調用函數setwindowshookex,指定wh_journalplayback挂鈎類型及相應挂鈎處理過程首位址來實作,如果用在日志回調過程中按下<ctrl+esc>或<ctrl+alt+del>組合鍵,系統将終止回調,取消此日志回調過程,并寄送一個wm_canceljournal消息給日志應用程式.

若此挂鈎處理過程傳回的消息在wm_keyfirst 或wm_keylast的範圍内,則以下情形發生.

結構eventmsg的paraml成員訓示按下的虛拟鍵編碼值,結構eventmsg的paramh成員訓示掃描嗎,這種情況下無法訓示出重複按鍵的次數,這個事件僅表示一個按鍵事件.

lresult callback journalrecordproc(int code,wparam wparam,lparam lparam);  

該函數處理過程是應用程式或庫定義的回調函數, 它與函數setwindowshookex搭配使用,此函數紀錄系統從系統消息隊列中删除的消息,此後,一個應用程式可以通過使用挂鈎處理過程journalplaybackproc對此消息進行回調.

類型hookproc定義了指向此類回調函數的指針, journalrecordproc是應用程式定義或庫定義的相應回調函數名的位置辨別符.

訓示如何處理此消息,此參數可以是以下值之一:

hc_action: 參數lparam指向結構 eventmsg ,該結構包含從系統消息隊列中删除了的消息的有關資訊,此挂鈎處理過程必須紀錄下此結構的内容,将其拷貝到一個緩沖區或檔案中.

hc_sysmodaloff: 一個系統的有模式對話框正在被銷毀,此挂鈎處理過程必須進行紀錄.

hc_sysmodalon:一個系統的有模式對話框正在被顯示,此挂鈎處理過程必須停止紀錄.

若ncode之值小于0,此挂鈎處理過程必須将此消息不加處理地傳送給函數callnexthookex并傳回其傳回值.

指定為null(0).

指向結構eventmsg ,該結構包含将被紀錄的消息.

傳回值被忽略.

備注:一個journalrecordproc挂鈎處理過程必須拷貝但不能修改此消息,在次挂鈎處理過程控制交還給系統之後,此消息繼續被處理.

安裝一個journalrecordproc挂鈎處理過程是通過調用函數setwindowshookex指定wh_journalrecord挂鈎類型和相應挂鈎處理過程的首位址來安裝此挂鈎處理過程.過程并非隻能存在于動态連結庫中,一個應用程式自身也可擁有自己的journalrecordproc挂鈎處理過程.

與其餘大多數全局挂鈎處理過程不同,挂鈎處理過程journalrecordproc和journalplaybackproc總是在設定了該挂鈎的線程上下文中被調用.一個安裝了journalrecordproc挂鈎處理過程的應用程式該對虛拟鍵vk_cancel進行監視(在大多數鍵盤上,虛拟鍵vk_cancel被實作為組合鍵< ctrl+break>),此虛拟鍵應被應用程式解釋為使用者希望終止進行日志紀錄的信号,而應用程式對此進行響應,結束相應的紀錄序列,并删除挂鈎處理過程journalrecordproc,在這裡,删除挂鈎處理過程是很重要的,此舉使得應用程式免于因為在一個挂鈎處理過程内部被挂起而将系統鎖住.

這種作為終止日志紀錄信号的角色使得組合鍵<ctrl+break>本身無法被紀錄,而組合鍵<ctrl+c>并不充當日志紀錄信号的角色,是以可以被紀錄,這裡還有兩種組合鍵是不能被紀錄的:即<ctrl+esc> 和<ctrl+alt+del>,這兩組組合鍵導緻系統終止所有的日志活動(紀錄或回調),删除所有的日志挂鈎,并将消息wm_canceljournal寄送給日志應用程式.

lresult callback keyboardproc(int code,lparam lparam);  

該函數是應用程式或庫檔案定義的回調函數, 它與函數setwindowshookex搭配使用,當應用程式調用函數 getmessage 或peekmessage 并且目前恰好有一個鍵盤消息 (wm_keyup or wm_keydown) 将要被處理時,系統就調用此挂鈎處理過程.

類型hookproc定義了指向此類回調函數的指針, keyboardproc是應用程式定義或庫定義的相應回調函數名的位置辨別符.

指定一個代碼,該代碼被挂鈎處理過程用于決定如何處理此消息,此參數可以為以下值之一:

hc_action 參數 wparam 和 lparam包含一個擊鍵消息的資訊.

hc_noremove 參數wparam and lparam包含一個擊鍵消息的資訊,并且此擊鍵消息尚未從消息隊列中被删除(一個應用程式調用函數peekmessage 并設定了pm_noremove 标志).

若ncode的值小于0,則此挂鈎函數必須不加處理地傳送給函數callnexthookex,并傳回其傳回值.

訓示産生此擊鍵消息的虛拟鍵代碼.

訓示重複次數,掃描碼,擴充标志,上下文代碼,此前的鍵狀态标志和變化狀态标志,此參數可以是以下值的組合值:

0-15位:訓示重複次數,此值紀錄力偶由于使用者繼續摁鍵引發的擊鍵重複次數.

16-23位:訓示掃描碼,此值依賴于鍵盤生産廠家.

第24位:訓示此鍵是否為擴充鍵,比如功能鍵或數字小鍵盤上的鍵,當該鍵為擴充時,其值為1,否則為0.

25-28位:保留未用.

第29位:上下文代碼.若alt鍵被摁下,則此值為1,否則為0.

第30位:訓示此前的鍵狀态,若在此消息被發送之前該鍵是摁下的,其值為1.若此前該鍵未被摁下,則其值為0.

第31位:訓示變化狀态,若此鍵正在被摁下,則其值位0. 正在被釋放其值為1.

欲獲得更多關于此lparam參數的資訊,請參見 keystroke message flags.

若ncode的值小于0,則此挂鈎函數必須傳回函數callnexthookex所傳回的值;若ncode的值大于或等于0,并且此挂鈎處理過程并未對此消息進行處理,我們極力推薦對函數callnexthookex進行調用,并傳回其傳回值.否則,其他安裝了挂鈎wm_keyboard的應用程式将無法收到挂鈎通知,進而導緻錯誤的行為.若此挂鈎處理過程對此消息進行了處理,它應傳回非0值以避免系統将此消息傳遞給挂鈎鍵上的其他處理過程或目标視窗的處理過程.

一個應用程式通過調用函數setwindowshookex指定wm_keyboard挂鈎類型和相應挂鈎處理過程的首位址來安裝此挂鈎處理過程.

lresult callback messageproc(int code,wparam wparam,lparam lparam);  

挂鈎處理過程是應用程式或庫中定義的回調函數,它與函數 setwindowshookex搭配使用.當一個對話框、消息框、菜單條、或滾動條中的輸入事件發生,且由此引發的消息尚未被處理之前,系統對此挂鈎處理過程進行調用.此函數可以對一個特定應用程式或所有應用程式的對話框、消息框、菜單條、或滾動引發的條消息進行監視.

類型hookproc定義了指向此類回調函數的指針. messageproc 是庫中相應回調函數名的位置标志符.

msge_ddemgr:當動态資料交換管理庫(dynamic data exchange management library (ddeml)正在等待一個同步處理的結束時産生此事件,關于ddeml的詳情,參見dynamic data exchange management library .

若ncode的值小于0,則此挂鈎處理過程必須傳回callnexthookex 的傳回值.若ncode的值大于或等于0,并且此挂鈎處理過程未對該消息進行處理,則調用函數callnexthookex 并傳回其傳回值是被推薦的.否則,其他安裝了wh_msgfilter挂鈎的應用程式将無法收到此挂鈎通知,并可能由此導緻錯誤的行為.若此挂鈎處理過程處理了此消息,它應傳回一個非0值以避免系統再将此消息傳送給挂鈎鍊上的其他挂鈎處理過程或目标視窗處理過程.

一個應用程式通過調用函數setwindowshookex指定wh_msgfilter挂鈎類型和相應挂鈎處理過程的首位址來安裝此挂鈎處理過程.

若一個應用程式使用了ddeml并實行同步處理,而且要求必須在消息被分派前處理之,則一定要使用wh_msgfilter挂鈎.

lresult callback mouseproc(int ncode, wparam wparam, lparam lparam);  

該函數是應用程式或庫檔案定義的回調函數, 它與函數setwindowshookex搭配使用,當應用程式調用函數 getmessage 或peekmessage 并且目前恰好有一個滑鼠消息将要被處理時,系統就調用此挂鈎處理過程.

類型hookproc定義了指向此類回調函數的指針, mouseproc是應用程式定義或庫定義的相應回調函數名的位置辨別符.

訓示一個代碼被挂鈎處理過程用于決定如何處理此消息,此參數可以是以下值之一:

hc_action 訓示參數wparam 和lparam 包含了關于滑鼠消息的資訊.

hc_noremove 訓示參數 wparam和lparam 中包含了關于滑鼠的資訊,而且此滑鼠消息尚未從消息隊列中被删除(一個應用程式調用函數peekmessage并設定了 pm_noremove标志).

訓示滑鼠消息的辨別符,

指向mousehookstruct 結構的[指針].

若ncode的值小于0,則此挂鈎函數必須傳回函數callnexthookex所傳回的值;若ncode的值大于或等于0,并且此挂鈎處理過程尚未對此消息進行處理,我們極力推薦對函數callnexthookex進行調用,并傳回其傳回值.否則,其他安裝了挂鈎wm_mouse的應用程式将無法收到挂鈎通知,進而導緻錯誤的行為.若此挂鈎處理過程對此消息進行了處理,它應傳回非0值以避免系統将此消息傳遞給目标視窗的處理過程.

一個應用程式通過調用函數setwindowshookex指定wm_mouse挂鈎類型和相應挂鈎處理過程的首位址來安裝此挂鈎處理過程.此挂鈎處理過程一定不能安裝journalplaybackproc回調函數.

繼續閱讀