1. 程式人生 > 實用技巧 >鉤子(HOOK)函式教程

鉤子(HOOK)函式教程

http://blog.sina.com.cn/s/articlelist_1585708262_3_1.html

鉤子(HOOK)函式教程(一)

我們可以首先從字面上瞭解鉤子,鉤子是幹什麼的呢?日常生活中,我們的鉤子是用來鉤住某種東西的,比如,說,魚鉤是用來釣魚的,一旦魚咬了鉤,鉤子就一直鉤住魚了,任憑魚在水裡怎麼遊,也逃不出魚鉤的控制。同樣的,Windows的鉤子Hook也是用來鉤東西的,比較抽象的是他是用來鉤Windows事件或者訊息的。最常見的就是滑鼠和鍵盤鉤子,用Hook鉤子鉤住滑鼠、鍵盤,當你的滑鼠、鍵盤有任何操作時,通過Hook就能知道他們都做了什麼了,多麼形象啊,把老鼠Mouse鉤住了,不管你幹什麼,都逃不過我鉤子Hook的手掌心。 技術上講,鉤子(Hook)是Windows訊息處理機制的一個很重要的內容,誰叫Windows是基於訊息的呢。應用程式可以通過鉤子機制截獲處理Window訊息或是其他一些特定事件。 我們可以在同一個鉤子上掛很多東西。 想起參加工作前要求被體檢的時候,當你被登記之後,按照你的登記表上的順序,就等著到各個科室一個一個的去檢查吧。每一個科室都有決定你是否繼續的可能,只有通過了這個,你才可以到下一個去,如果沒有通過,那麼,你是看不到最後的大夫了,可以直接over回家了。 如果把體檢比喻為事件的話,當事件發生時,應用程式(體檢過程)可以在相應的鉤子Hook上設定多個鉤子子程式(Hook Procedures)(多個科室的檢查),由其組成一個與鉤子相關聯的指向鉤子函式的指標列表(鉤子連結串列)(體檢表,確定了你要走的順序)。當鉤子所監視的訊息出現時(你拿著表格來體檢了),Windows(導診員)首先將其送到呼叫連結串列中所指向的第一個鉤子函式中(體檢表上第一個科室,一般是身高體重吧,呵呵),鉤子函式將根據其各自的功能(每個科室檢查的專案不一樣啊)對訊息進行監視(有的大夫就隨便看看了事),、修改(碰到好心的大夫還可以幫你往好裡添點呢,呵呵)和控制(有的大夫好嚴格啊),並在處理完成後(當然有的大夫就直接把你刷下了,回家吧,沒有下一個了)把訊息傳遞給下一鉤子函式(下一個專案的科室,當然,也可以強制訊息的傳遞,直接打發你回家)直至到達鉤子連結串列的末尾(檢查完了!)。在鉤子函式交出控制權後,被攔截的訊息最終仍將交還給視窗處理函式(好了,拿著表去上班吧)。 雖然鉤子函式對訊息的過濾將會略加影響系統的執行效率,但在很多場合下通過鉤子對訊息的過濾處理可以完成一些其他方法所不能完成的特殊功能。

哦,想起來了,金山詞霸的螢幕取詞是不是就是使用Hook實現的吧?

鉤子(HOOK)函式教程(二)

比較專業的對鉤子的技術性理解

鉤子(Hook),是Windows訊息處理機制的一個平臺,應用程式可以在上面設定子程以監視指定視窗的某種訊息,而且所監視的視窗可以是其他程序所建立的。當訊息到達後,在目標視窗處理函式之前處理它。鉤子機制允許應用程式截獲處理window訊息或特定事件。

Windows系統是建立在事件驅動的機制上的,說穿了就是整個系統都是通過訊息的傳遞來實現的。而鉤子是Windows系統中非常重要的系統介面,用它可以截獲並處理送給其他應用程式的訊息,來完成普通應用程式難以實現的功能。鉤子可以監視系統或程序中的各種事件訊息,截獲發往目標視窗的訊息並進行處理。這樣,我們就可以在系統中安裝自定義的鉤子,監視系統中特定事件的發生,完成特定的功能,比如截獲鍵盤、滑鼠的輸入,螢幕取詞,日誌監視等等。可見,利用鉤子可以實現許多特殊而有用的功能。

鉤子實際上是一個處理訊息的程式段,通過系統呼叫,把它掛入系統。每當特定的訊息發出,在沒有到達目的視窗前,鉤子程式就先捕獲該訊息,亦即鉤子函式先得到控制權。這時鉤子函式即可以加工處理(改變)該訊息,也可以不作處理而繼續傳遞該訊息,還可以強制結束訊息的傳遞。

一個Hook都有一個與之相關聯的指標列表,稱之為鉤子連結串列,由系統來維護。這個列表的指標指向指定的,應用程式定義的,被Hook子程呼叫的回撥函式,也就是該鉤子的各個處理子程。當與指定的Hook型別關聯的訊息發生時,系統就把這個訊息傳遞到Hook子程。一些Hook子程可以只監視訊息,或者修改訊息,或者停止訊息的前進,避免這些訊息傳遞到下一個Hook子程或者目的視窗。最近安裝的鉤子放在鏈的開始,而最早安裝的鉤子放在最後,也就是後加入的先獲得控制權。zdwork.cn

Windows 並不要求鉤子子程的解除安裝順序一定得和安裝順序相反。每當有一個鉤子被解除安裝,Windows 便釋放其佔用的記憶體,並更新整個Hook連結串列。如果程式安裝了鉤子,但是在尚未解除安裝鉤子之前就結束了,那麼系統會自動為它做解除安裝鉤子的操作。

大多數人或者網上文章認為全域性鉤子都要依賴於一個DLL才能正常工作的,常常會看到很多人在論壇上長期爭論一個話題:“全域性鉤子一定要在DLL裡面嗎?”。實際上這裡有一個概念的問題,究竟上面提到的全域性鉤子是指什麼。通過對上面各種鉤子的作用域的理解就會發現這個問題的答案。本文來自智動軟體zdwork.cn

上面一共提到了15種鉤子,他們的作用域請看下錶:

Hook

Scope

WH_CALLWNDPROC

Thread or global

WH_CALLWNDPROCRET

Thread or global

WH_CBT

Thread or global

WH_DEBUG

Thread or global

WH_FOREGROUNDIDLE

Thread or global

WH_GETMESSAGE

Thread or global

WH_JOURNALPLAYBACK

Global only

WH_JOURNALRECORD

Global only

WH_KEYBOARD

Thread or global

WH_KEYBOARD_LL

Global only

WH_MOUSE

Thread or global

WH_MOUSE_LL

Global only

WH_MSGFILTER

Thread or global

WH_SHELL

Thread or global

WH_SYSMSGFILTER

Global only

表一:鉤子作用域

WH_JOURNALPLAYBACK,WH_JOURNALRECORD,WH_KEYBOARD_LL,WH_MOUSE_LL、WH_SYSMSGFILTER這5種鉤子本身的作用域就是全域性的,不管鉤子是直接寫在應用程式的程式碼裡還是放在DLL中,他們都能夠鉤住系統的訊息。剩下的10種鉤子,他們的作用域既可以是執行緒的又可以是全域性的,當將相應的鉤子直接寫在應用程式的程式碼中時,他們只能捕獲當前執行緒上下文的訊息。那麼他們如何實現捕獲全域性訊息的功能呢?當把鉤子寫入到一個單獨的DLL中再引用後,系統自動將該DLL對映到受鉤子函式影響的所有程序的地址空間中,即將這個DLL注入了那些程序,從而達到捕獲全域性訊息的目的。相對來說,前面5種鉤子本身就是全域性的,是不需要注入的。

因此,對於前面問題的答案就是:要實現捕獲全域性訊息功能的鉤子,是否要寫在單獨的DLL裡面,取決於鉤子的型別以及相應的作用域。

如果對於同一事件既安裝了執行緒勾子又安裝了全域性勾子,那麼系統會自動先呼叫執行緒勾子,然後呼叫全域性勾子。

鉤子(HOOK)函式教程(三)

系統必須要處理每個訊息,而鉤子的使用增加了系統對每個訊息要執行的處理的數量,因此,鉤子會減慢系統。應該僅僅在必須的時候才安裝鉤子,並且儘可能早的將其解除安裝掉。

Hook Chain(鉤子連結串列)

系統支援很多不同種類的鉤子,每種型別提供對訊息處理機制裡的某一不同方面的訪問。例如,應用程式可以使用WH_MOUSE Hook監視滑鼠訊息的傳遞。

系統為每類鉤子維護著一個獨立的鉤子連結串列。鉤子連結串列是一個指標的列表,其中的指標指向特定的、應用程式定義的回撥函式,該函式被叫做鉤子子程(hook procedure)。當與某種特定型別的鉤子相關聯(鉤住)的訊息發生時,系統將訊息一個接一個地傳遞給鉤子鏈中的每一個鉤子子程(hook procedure),鉤子子程能夠採取的動作取決於涉及的鉤子的型別。某些型別的鉤子子程僅僅能監視訊息;另外一些就能夠修改訊息或者終止訊息在鉤子連結串列中的前進,這樣就阻止了訊息到達下一個鉤子子程或者目標窗體。

這裡有幾個概念上的翻譯,主要有:

Hook Chain : 鉤子連結串列

hook procedures : 鉤子子程(即得到訊息後進行處理的程式段)

鉤子(HOOK)函式教程(四)

Hook Procedures(鉤子子程)

為了利用某種特定型別的鉤子,開發者提供了鉤子子程。可以使用SetWindowsHookEx方法將該鉤子子程安裝到和該鉤子相關聯的鉤子連結串列中。鉤子子程必須具有下面的語法:

LRESULT CALLBACK HookProc
(
int nCode,

WPARAM wParam,

LPARAM lParam,
);

HookProc是應用程式定義的鉤子處理程式的名字。

引數nCode:鉤子程式碼,鉤子子程通過該程式碼來決定執行什麼動作。該值取決於鉤子的型別,每種型別都擁有自己特有的鉤子程式碼集合。

引數wParam和lParam的值,都取決於鉤子程式碼。但是一般都包含傳送或者傳遞的訊息的資訊。

方法SetWindowsHookEx總是在鉤子鏈的開始位置安裝鉤子子程。當被某種型別的鉤子監視的事件發生時,系統呼叫和該鉤子相關的位於鉤子連結串列開始位置的鉤子子程。每個鉤子連結串列中的鉤子子程決定是否將該事件傳遞給下一個鉤子子程。鉤子子程通過呼叫方法CallNextHookEx向下一個鉤子子程傳遞事件。

注意:某些型別的鉤子子程僅僅能夠監視訊息,系統不管是否有特殊的鉤子子程呼叫CallNextHookEx方法,都將把訊息傳遞給每個鉤子子程.

全域性鉤子監視同一桌面下所有做為呼叫執行緒的執行緒訊息。執行緒鉤子僅僅監視該單個執行緒的訊息。全域性鉤子子程可以在所在桌面下任何應用程式的上下文中被呼叫,因此,該鉤子子程式須在一個單獨的動態連結庫DLL中。

執行緒鉤子的鉤子子程只能在本執行緒的上下文中被呼叫。如果應用程式為他自己執行緒中的某個鉤子安裝鉤子子程,鉤子子程能夠放在本模組中、應用程式程式碼的其它部分、Dll中。

如果應用程式為另外一個不同的應用程式安裝鉤子子程,鉤子子程必須放在Dll中。

注意:只應為了除錯目的而使用全域性鉤子;否則應避免使用。全域性鉤子會犧牲系統性能。使用了相同型別的全域性鉤子的應用程式之間也會有衝突.

鉤子(HOOK)函式教程(五)

從現在開始,介紹全部鉤子型別,一共有15種。

每種型別的鉤子使應用程式能夠監視系統的訊息處理機制的不同方面。

鉤子型別1-2:WH_CALLWNDPROC and WH_CALLWNDPROCRET Hooks

WH_CALLWNDPROC 和 WH_CALLWNDPROCRET鉤子使你能夠監視傳送到window程式的訊息。系統在將訊息傳遞給正在接收的window程式之前,呼叫WH_CALLWNDPROC鉤子子程;在window程式處理完訊息之後,呼叫WH_CALLWNDPROCRET鉤子子程。

WH_CALLWNDPROCRET鉤子將一個指向CWPRETSTRUCT結構的的指標傳遞給鉤子子程。該結構包含有來自處理該訊息的window程式的返回值,以及訊息中的引數。子類窗體不能處理程序間的訊息集。

鉤子型別3:WH_CBT Hook

在以下事件發生之前,系統會呼叫WH_CBT 鉤子子程:

1、窗臺被啟用、建立、銷燬、最小化、最大化、移動或者改變大小

2、執行完系統命令

3、從系統訊息佇列中移除滑鼠或者鍵盤事件

4、設定輸入焦點

5、同步系統訊息佇列

鉤子子程的返回值決定了系統是允許了還是阻止了這些操作中的一個。

WH_CBT鉤子主要是用在基於計算機的練習(CBT) 程式中。

鉤子型別4:WH_DEBUG Hook

在呼叫與系統中任何其他鉤子關聯的鉤子子程之前,系統會呼叫WH_DEBUG 鉤子子程。使用該鉤子來決定是否允許系統呼叫與其他型別的鉤子相關聯的鉤子子程。

鉤子型別5:WH_FOREGROUNDIDLE Hook

WH_FOREGROUNDIDLE 鉤子允許當前臺執行緒空閒時,執行低許可權的任務。系統在應用程式的前臺執行緒即將空閒時,呼叫WH_FOREGROUNDIDLE鉤子子程。

鉤子型別6:WH_GETMESSAGE Hook

WH_GETMESSAGE程式允許應用程式監視即將由方法GetMessage 或者PeekMessage返回的訊息。可以使用WH_GETMESSAGE鉤子監視滑鼠和鍵盤輸入,以及其他傳遞給訊息佇列的訊息

鉤子(HOOK)函式教程(六)

鉤子型別介紹(續一)

鉤子型別7:WH_JOURNALPLAYBACK Hook

WH_JOURNALPLAYBACK鉤子允許應用程式將訊息插入到系統訊息佇列中。使用該鉤子回放先前使用WH_JOURNALRECORD 鉤子記錄的一系列滑鼠和鍵盤事件。在WH_JOURNALPLAYBACK被安裝後,常規的滑鼠和鍵盤輸入被禁用。WH_JOURNALPLAYBACK鉤子是全域性鉤子,不能被用作執行緒鉤子。WH_JOURNALPLAYBACK鉤子返回一個超時值。該值告訴系統在處理來自回放鉤子的當前訊息之前等待了多少毫秒。這允許該鉤子控制回放事件的速度。

鉤子型別8:WH_JOURNALRECORD Hook

WH_JOURNALRECORD鉤子允許監視並且記錄輸入事件。典型的,使用該鉤子來記錄順序的的滑鼠和鍵盤事件,以後可以使用WH_JOURNALPLAYBACK.鉤子進行回放。 該鉤子是全域性鉤子,不能被用作程序鉤子。

鉤子型別9:WH_KEYBOARD_LL Hook

WH_KEYBOARD_LL鉤子監視線上程輸入佇列中,即將被傳遞的鍵盤輸入事件。

鉤子型別10:WH_KEYBOARD Hook

WH_KEYBOARD鉤子允許應用程式監視即將被GetMessage 或者 PeekMessage方法返回的WM_KEYDOWN 或者 WM_KEYUP訊息。使用WH_KEYBOARD鉤子可以監視傳遞到訊息佇列中的鍵盤輸入。

鉤子型別11:WH_MOUSE_LL Hook

WH_MOUSE_LL鉤子監視線上程輸入佇列中,即將被傳遞的滑鼠輸入事件。

鉤子型別12:WH_MOUSE Hook

WH_MOUSE鉤子允許監視即將被GetMessage或者 PeekMessage方法返回的滑鼠訊息。使用該鉤子監視傳遞到執行緒輸入佇列的滑鼠輸入.

鉤子(HOOK)函式教程(七)


鉤子型別介紹(續二) 鉤子型別13、14:WH_MSGFILTER and WH_SYSMSGFILTER WH_MSGFILTER 和 WH_SYSMSGFILTER鉤子允許監視即將由選單、滾動條、訊息框、對話方塊處理的訊息,並且在使用者按下了ALT+TAB 或者ALT+ESC組合鍵後,檢測何時一個不同的視窗將被啟用。 WH_MSGFILTER鉤子僅僅能監視傳遞到選單、滾動條、訊息框或者由安裝了鉤子子程的應用程式建立的對話方塊的訊息。 WH_SYSMSGFILTER鉤子監視所有應用程式的這類訊息。 WH_MSGFILTER 和WH_SYSMSGFILTER鉤子允許在模式迴圈期間執行訊息過濾,這和在主訊息迴圈中執行過濾是等效的。 例如,應用程式在它從佇列中收到訊息到分派訊息期間,經常在主迴圈中檢查新的訊息,執行適當的處理。 然而,在模式迴圈期間,系統會收到、分派訊息,但是並不給應用程式機會去過濾主訊息迴圈中的訊息。 如果應用程式安裝了WH_MSGFILTER 或者 WH_SYSMSGFILTER鉤子子程,系統會在模式迴圈期間呼叫鉤子子程。 應用程式可以通過呼叫CallMsgFilter方法直接呼叫WH_MSGFILTER鉤子。 通過使用該方法,應用程式可以像在主訊息迴圈中一樣,使用同樣的程式碼來過濾訊息。 這樣做呢,可以在WH_MSGFILTER鉤子子程中封裝過濾的操作,在呼叫GetMessage和 DispatchMessage方法期間呼叫CallMsgFilter。 while (GetMessage(&msg, (HWND) NULL, 0, 0)) { if (!CallMsgFilter(&qmsg, 0)) DispatchMessage(&qmsg); } CallMsgFilter的最後一個引數簡單的傳遞給鉤子子程;可以輸入任何值。鉤子子程,通過定義像MSGF_MAINLOOP一樣的常量,可以使用該值來決定鉤子子程是被哪裡呼叫的。 鉤子型別15:WH_SHELL 加殼程式可以使用WH_SHELL鉤子來接收重要的通知。 當加殼程式即將被啟用時、當處在最頂層的視窗被建立或者銷燬時,系統會呼叫WH_SHELL鉤子子程。 注意:常規加殼程式並不接收WH_SHELL訊息。 因此,任何將自己註冊為預設外殼的應用程式必須在它(或者任何其它應用程式)能夠接收WH_SHELL訊息之前呼叫帶有SPI_SETMINIMIZEDMETRICS 的SystemParametersInfo方法

鉤子(HOOK)函式教程(八)

認識完各種鉤子型別之後,接下來了解和鉤子如影隨形的鉤子子程,即相應的回撥函式。

方法1:CallMsgFilter

CallMsgFilter方法傳遞特定的訊息和鉤子程式碼到與WH_SYSMSGFILTER 和 WH_MSGFILTER鉤子相關聯的鉤子子程。

WH_SYSMSGFILTER或者 WH_MSGFILTER鉤子子程是應用程式定義的回撥函式,該回調函式用來檢驗、選擇、修改傳遞給對話方塊、訊息框、選單或者滾動條的訊息.

BOOL CallMsgFilter( LPMSG lpMsg, int nCode);

引數說明 :

lpMsg :指向MSG結構的指標,該結構包含有即將傳遞給鉤子子程的訊息。

nCode :指定應用程式定義的程式碼,鉤子子程使用該程式碼來決定如何處理訊息。

該程式碼不能與系統定義的與WH_SYSMSGFILTER 和 WH_MSGFILTER鉤子相關的鉤子程式碼 (MSGF_ and HC_)相同。

Return Value:如果應用程式應該進一步處理該訊息,返回值為0;如果不處理,返回非0值。

Remarks: 系統呼叫CallMsgFilter方法來允許應用程式檢查、控制在對話方塊、訊息框、選單、滾動條內部處理中的訊息的流動,或者當用戶通過按下ALT+TAB組合鍵啟用不同的視窗時的資訊流動。

通過SetWindowsHookEx方法來安裝該鉤子子程。

方法2 :CallNextHookEx

CallNextHookEx方法將鉤子資訊傳遞給當前鉤子連結串列中的下一個鉤子子程。

鉤子子程能夠在處理鉤子資訊之前或者之後呼叫該方法。

LRESULT CallNextHookEx( HHOOK hhk,int nCode,WPARAM wParam,LPARAM lParam);

引數:

hhk :Ignored.

nCode :制定傳遞給當前Hook處理函式的hook碼,下一個Hook處理函式使用該Code來決定如何處理Hook資訊。

wParam / lParam :這兩個引數分別指定傳遞給當前鉤子子程的wParam / lParam值。引數的意義取決於與當前鉤子連結串列相關聯的鉤子型別。

返回值:該值由鉤子連結串列中的下一個鉤子子程返回。當前鉤子子程也必須返回該值。返回值的意義取決於鉤子型別。

注意:

鉤子子程為了特定的鉤子型別而被安裝。CallNextHookEx方法呼叫鉤子連結串列中的下一個鉤子。呼叫CallNextHookEx是可選的,但是強烈要求呼叫該函式;否則,其他已經安裝有鉤子的應用程式將收不到鉤子通知,從而可能導致不正確的行為。除非絕對需要阻止通知被其他應用程式看到,其它情況下都應該呼叫CallNextHookEx方法

鉤子(HOOK)函式教程(九)

方法3 :CallWndProc

CallWndProc鉤子子程是與SetWindowsHookEx一起使用的、使用者定義的或者庫定義的回撥函式。

HOOKPROC型別定義了指向該回調函式的指標。

CallWndProc是程式定義的或者庫定義的方法名字。

語法:LRESULT CALLBACK CallWndProc(Int nCode,WPARAM wParam,LPARAM lParam);

引數:

nCode:指定鉤子子程是否必須處理該訊息。

如果nCode是HC_ACTION,鉤子子程就必須處理該訊息。

如果nCode小於0,鉤子子程就必須將該訊息傳遞給CallNextHookEx,自己不對訊息進行進一步的處理,必須返回由CallNextHookEx 方法返回的返回值。

wParam :指定訊息是否由當前執行緒發出。如果訊息是由當前執行緒發出的,該值就是非0;否則,就是0。

lParam :指向CWPSTRUCT結構的指標,該結構含有訊息的細節資訊。

返回值:如果nCode小於0,鉤子子程必須返回由CallNextHookE方法返回的返回值。

如果nCode大於等於0,強烈要求呼叫CallNextHookEx方法,並返回由它返回的返回值;否則,其他已經安裝了WH_CALLWNDPROC鉤子的應用程式將收不到鉤子通知,可能導致行為的錯誤。

如果鉤子子程沒有呼叫CallNextHookEx方法,返回值應該為 0。

備註:CallWndProc鉤子子程能夠檢查訊息,但是不能修改訊息。當鉤子子程將控制權交還給系統之後,訊息被傳遞給窗體程式。

應用程式這樣安裝鉤子子程:指定WH_CALLWNDPROC鉤子型別,指定一個指向呼叫SetWindowsHookEx方法的鉤子子程的指標。

方法4 :CallWndRetProc

CallWndRetProc鉤子子程是與SetWindowsHookEx一起使用的、使用者定義的或者庫定義的回撥函式。

在SendMessage方法被呼叫之後,系統呼叫CallWndRetProc方法。

鉤子子程能夠檢查、但是不能修改訊息。

HOOKPROC型別定義了指向該回調函式的指標。

CallWndRetProc是程式定義的或者庫定義的方法名字。

語法:

LRESULT CALLBACK CallWndRetProc(int nCode,WPARAM wParam,LPARAM lParam);

引數:

nCode :指定鉤子子程是否必須處理訊息。

如果nCode是HC_ACTION,鉤子子程必須處理該訊息。

如果nCode小於0,鉤子子程就必須將該訊息傳遞給CallNextHookEx方法,自己不對訊息進行進一步的處理,必須返回由CallNextHookEx 方法返回的返回值。

wParam :指定訊息是否由當前程序發出。如果訊息是由當前程序發出的,wParam為非0;否則,為NULL。

lParam :指向CWPSTRUCT結構的指標,該結構含有訊息的細節資訊。

返回值:如果nCode小於0,鉤子子程必須返回由CallNextHookE返回的返回值。

如果nCode大於等於0,強烈要求呼叫CallNextHookEx方法,並返回由它返回的返回值;否則,其他已經安裝了WH_ CALLWNDPROCRET鉤子的程式將收不到鉤子通知,可能導致行為的錯誤。

如果鉤子子程沒有呼叫CallNextHookEx方法,返回值應該為0。

備註:應用程式這樣安裝鉤子子程:指定WH_ CALLWNDPROCRET鉤子型別,指定一個指向呼叫SetWindowsHookEx方法的鉤子子程的指標

鉤子(HOOK)函式教程(十)

方法5:CBTProc

CBTProc鉤子子程是和SetWindowsHookEx方法同時使用的、程式定義的或者庫定義的回撥函式。

系統在下列事件發生之前呼叫該方法:

啟用、建立、銷燬、最小化、最大化、移動窗體、改變窗體大小

完成系統命令

從系統訊息佇列中移除滑鼠或者鍵盤事件

設定鍵盤焦點

同步系統訊息佇列。

CBT應用程式使用該鉤子子程接收來自系統的有用的通知。

HOOKPROC型別定義了指向該回調函式的指標。

CBTProc是程式定義的或者庫定義的方法名字。

LRESULT CALLBACK CBTProc( int nCode,WPARAM wParam,LPARAM lParam);

引數:

nCode:指定一個碼值,鉤子子程使用該值來決定如何處理訊息。

如果nCode小於0,鉤子子程就必須將該訊息傳遞給CallNextHookEx方法,自己不對訊息做進一步的處理,並且應該返回由CallNextHookEx方法返回的返回值。

該引數可以是以下值中的一個:

1.HCBT_ACTIVATE :系統即將建立一個窗體。

2.HCBT_CLICKSKIPPED :系統已經將一個滑鼠訊息從系統訊息佇列中移除。一旦收到該鉤子程式碼,CBT應用程式必須安裝一個WH_JOURNALPLAYBAC鉤子子程來響應滑鼠訊息。

3.HCBT_CREATEWND :窗體即將被建立。系統在向窗體發出WM_CREATE 或者 WM_NCCREATE訊息之前,呼叫該鉤子子程。

如果鉤子子程返回非0值,表示系統銷燬了窗體;CreateWindow方法返回Null,但是WM_DESTROY訊息並不傳送給窗體。如果鉤子子程返回0,表示窗體正常被建立。

在 HCBT_CREATEWND通知的時候,窗體已經被建立了,但是它的最終的大小和位置可能還沒有被確定,它的父窗體也可能沒有被建立起來。

雖然一個新建立的窗體可能還沒有接收到WM_NCCREATE或者WM_CREATE訊息,但是向它傳送訊息是可能的。

通過修改CBT_CREATEWND 結構體的hwndInsertAfter成員,改變新建立窗體的在Z軸次序的位置也是可能的。

4.HCBT_DESTROYWND :窗體即將被銷燬。

5.HCBT_KEYSKIPPED :系統已經從系統的訊息佇列中移除了一個鍵盤訊息。一旦接收到該鉤子程式碼,CBT應用程式必須安裝一個WH_JOURNALPLAYBAC鉤子來響應鍵盤訊息。

6.HCBT_MINMAX :窗體即將被最小化或者最大化。

7.HCBT_MOVESIZE :窗體即將被移動或者重置大小。

8.HCBT_QS :系統已經收到了一個來自系統訊息佇列的WM_QUEUESYNC訊息。

9.HCBT_SETFOCUS :窗體即將接收鍵盤焦點。

10.HCBT_SYSCOMMAND :系統命令即將被執行。這允許CBT程式阻止通過快捷鍵來進行任務切換。

wParam :取決於引數

lParam :取決於引數

返回值:鉤子子程的返回值取決於系統允許還是阻止這種操作。

1、對於下列這些操作的CBT鉤子程式碼,如果允許則返回值必須是0,如果阻止返回值必須是1。

HCBT_ACTIVATE ;HCBT_CREATEWND ;HCBT_DESTROYWND ;HCBT_MINMAX ;HCBT_MOVESIZE ;HCBT_SETFOCUS ;HCBT_SYSCOMMAND

2、對於下列這些操作的CBT鉤子程式碼,返回值被忽略。

HCBT_CLICKSKIPPED ;HCBT_KEYSKIPPED ;HCBT_QS

鉤子(HOOK)函式教程(十一)

(2011-02-13 00:35:33) 轉載
標籤:

雜談

分類:Hook函式教程

方法6 : DebugProc

DebugProc鉤子子程是和SetWindowsHookEx方法一起使用的、程式定義的或者庫定義的回撥函式。

系統在呼叫和任何型別鉤子相關聯的鉤子子程之前呼叫該方法。

系統將即將被呼叫的鉤子的資訊傳遞給DebugProc鉤子子程,DebugProc鉤子子程檢查該資訊,決定是否允許該鉤子被呼叫。

HOOKPROC型別定義了指向該回調函式的指標。

DebugProc是程式定義的或者庫定義的方法名字。

LRESULT CALLBACK DebugProc(int nCode,WPARAM wParam,LPARAM lParam);

引數:

nCode :指定鉤子子程是否必須處理該訊息。

如果nCode是HC_ACTION,鉤子子程就必須處理該訊息。

如果nCode小於0,鉤子子程就必須將該訊息傳遞給CallNextHookEx方法,自己對訊息不做進一步處理,並且應該返回由CallNextHookEx方法返回的返回值。

wParam :指定即將被呼叫的鉤子型別。引數可以是下列之一:

1.WH_CALLWNDPROC :安裝一個鉤子子程來監視傳送給視窗過程的訊息。

2.WH_CALLWNDPROCRET :安裝一個鉤子子程來監視剛剛被視窗過程處理完的訊息。

3.WH_CBT :安裝一個鉤子子程來接收對CBT應用程式有用的通知。

4.WH_DEBUG :安裝一個有用的鉤子子程來除錯其他鉤子子程。

5.WH_GETMESSAGE :安裝一個鉤子子程來監視傳遞給訊息佇列的訊息。

6.WH_JOURNALPLAYBACK :安裝一個鉤子子程來發送先前使用WH_JOURNALRECORD鉤子子程記錄的訊息。

7.WH_JOURNALRECORD :安裝一個鉤子子程來記錄傳遞給系統訊息佇列的輸入訊息。該鉤子用來記錄巨集很有用。

8.WH_KEYBOARD :安裝一個鉤子子程來監視鍵盤敲擊訊息。

9.WH_MOUSE :安裝一個鉤子子程來監視滑鼠訊息。

10.WH_MSGFILTER :安裝一個鉤子子程來監視下列輸入事件的結果訊息:對話方塊、訊息框、選單、滾動條。該鉤子子程僅僅為安裝該鉤子子程的應用程式監視這些訊息。

11.WH_SHELL :安裝一個鉤子子程來接收對Shell類應用程式有用的通知。

12.WH_SYSMSGFILTER :安裝一個鉤子子程來監視下列輸入事件的結果訊息:對話方塊,訊息框,選單,滾動條。該鉤子子程為系統中所有的應用程式監視這些訊息。

lParam:指向DEBUGHOOKINFO結構的指標,該結構中含有傳遞給目標鉤子子程的引數。

返回值:為了阻止系統呼叫後續鉤子處理函式,鉤子子程必須返回一個非0值。否則,鉤子子程必須呼叫CallNextHookEx方法。

備註:應用程式通過下面方式安裝該鉤子子程:指定WH_DEBUG鉤子型別;在呼叫SetWindowsHookEx方法的函式中指向鉤子子程的指標。

鉤子(HOOK)函式教程(十二)

方法7 : ForegroundIdleProc

ForegroundIdleProc鉤子子程是和SetWindowsHookEx方法一起使用的、程式定義的或者庫定義的回撥函式。

當前臺執行緒即將變成空閒時,系統將呼叫該方法。

HOOKPROC型別定義了指向該回調函式的指標。

ForegroundIdleProc是程式定義的或者庫定義的方法名字。

DWORD CALLBACK ForegroundIdleProc(int code, DWORD wParam,LONG lParam);

引數:

code :指定鉤子子程是否必須處理訊息。

如果nCode是HC_ACTION,鉤子子程就必須處理該訊息。

如果nCode小於0,鉤子子程就必須將該訊息傳遞給CallNextHookEx方法,自己對訊息不做進一步處理,並且應該返回由CallNextHookEx方法返回的返回值。

wParam :未使用

lParam :未使用

返回值: 如果nCode小於0,鉤子子程必須返回由CallNextHookEx返回的返回值。

如果nCode大於等於0,強烈要求呼叫CallNextHookEx方法,並返回由它返回的返回值;否則,其他已經安裝了WH_ CALLWNDPROCRET鉤子的程式將收不到鉤子通知,可能導致行為的錯誤。

如果鉤子子程沒有呼叫CallNextHookEx方法,返回值應該是0。

備註: 應用程式通過下面方式安裝該鉤子子程:指定WH_ FOREGROUNDIDLE鉤子型別;在呼叫SetWindowsHookEx方法的函式中指向鉤子子程的指標

鉤子(HOOK)函式教程(十三)

方法8 : GetMsgProc

GetMsgProc是和SetWindowsHookEx方法一起使用的、程式定義的或者庫定義的回撥函式。

無論什麼時候,當GetMessage 或者 PeekMessage方法接收到來自應用程式訊息佇列的訊息時,系統都會呼叫該方法。

在將收到的訊息返回給呼叫者之前,系統將訊息傳遞給鉤子子程。

HOOKPROC型別定義了指向該回調函式的指標。

GetMsgProc是程式定義的或者庫定義的方法名字。

LRESULT CALLBACK GetMsgProc(int code,WPARAM wParam,LPARAM lParam);

引數:

code:指定鉤子子程是否必須處理訊息。

如果nCode是HC_ACTION,鉤子子程就必須處理該訊息。

如果nCode小於0,鉤子子程就必須將該訊息傳遞給CallNextHookEx方法,自己對訊息不做進一步處理,並且應該返回由CallNextHookEx方法返回的返回值。

wParam:指定訊息是否已經被從佇列中移除了。

該引數可以是下列值中的一個:

1.PM_NOREMOVE:指定訊息尚未從佇列中移出。(應用程式在呼叫該方法的同時指定PM_NOREMOVE標誌)

2.PM_REMOVE: 指定訊息已經被從佇列中移除了。(程式呼叫GetMessage 或者PeekMessage方法的同時指定PM_REMOVE標誌)

lParam :指向MSG結構的指標,結構中包含和訊息相關的細節。

返回值:

如果引數code小於0,鉤子子程必須返回由CallNextHookEx返回的返回值。

如果引數code大於等於0,強烈要求呼叫CallNextHookEx方法,並返回由該方法返回的返回值;否則,其他已經安裝了WH_GETMESSAGE鉤子的程式將收不到鉤子通知,可能導致行為的錯誤。

如果鉤子子程沒有呼叫CallNextHookEx方法,返回值應該是0

備註:GetMsgProc鉤子子程能夠檢查或者修改訊息。

在鉤子子程將控制權交還給系統之後,GetMessage 或者PeekMessage方法將該訊息以及任何修改都一起返回給最初呼叫它的應用程式。

應用程式通過下面方式安裝該鉤子子程:指定WH_ GETMESSAGE鉤子型別;指定在呼叫SetWindowsHookEx方法的函式中指向鉤子子程的指標。

鉤子(HOOK)函式教程(十四)

方法9 :JournalPlaybackProc

JournalPlaybackProc鉤子子程是和SetWindowsHookEx方法一起使用的、程式定義的或者庫定義的回撥函式。

典型的,應用程式使用該方法回放前期由JournalRecordProc鉤子子程記錄下來的一系列滑鼠和鍵盤訊息。

只要JournalPlaybackProc鉤子子程被安裝,常規的滑鼠和鍵盤輸入將被禁用。

HOOKPROC型別定義了指向該回調函式的指標。

JournalPlaybackProc 是程式定義的或者庫定義的方法名字。

LRESULT CALLBACK JournalPlaybackProc(int code,WPARAM wParam,LPARAM lParam);

引數:

code :指定鉤子子程使用的程式碼,以決定如何處理該訊息。

如果引數code小於0,鉤子子程不對其進行任何進一步的處理,必須將訊息傳遞給CallNextHookEx方法,返回由CallNextHookEx方法返回的返回值。

該引數可以是下列值之一:

1.HC_GETNEXT :鉤子子程必須將當前滑鼠或者鍵盤訊息拷貝給由引數lParam指向的EVENTMSG結構。

2.HC_NOREMOVE :應用程式已經呼叫帶有指向PM_NOREMOVE的 wRemoveMsg 集合的PeekMessage方法,指示該訊息在PeekMessage處理完畢後,沒有從訊息佇列中移除。

3.HC_SKIP :鉤子子程必須準備拷貝下一個滑鼠或者鍵盤訊息到由lParam 指向的 EVENTMSG結構。一旦接收到HC_GETNEXT程式碼,鉤子子程必須將訊息拷貝到結構體中。

4.HC_SYSMODALOFF :系統模態的對話方塊已經被銷燬。鉤子子程應該恢復回放訊息。

5.HC_SYSMODALON :系統模態的對話方塊正在被顯示。直到對話方塊被銷燬,鉤子子程應該停止返回訊息。

wParam :該引數未使用。

lParam :指向EVENTMSG結構的指標,該結構代表正在被鉤子子程處理的訊息。只有當引數code是HC_GETNEXT時該引數才有效。

返回值:

為了使系統在處理訊息之前等待,該返回值應該是系統應該等待的時間數量,該值以時鐘嘀嗒為單位(該值可以通過當前和前一個輸入訊息的time成員的差值來計算)。

為了快速的處理該訊息,返回值應該是0。

只有當鉤子程式碼是HC_GETNEXT時,返回值才有意義;否則,該引數被忽略。

備註:

JournalPlaybackProc鉤子子程應該拷貝一個輸入訊息到lparm引數。

訊息必須在先前已經使用JournalRecordProc鉤子子程被記錄了下來,JournalRecordProc鉤子子程不應修改訊息。

為了一遍又一遍的得到同樣的訊息,鉤子子程在將code引數設定為HC_GETNEXT,而不是HC_SKIP的情況下,可以被呼叫多次。

如果引數code 是 HC_GETNEXT,而且返回值大於0,系統將休眠,休眠時間是返回值指定的毫秒數。當系統繼續的時候,將引數設定為HC_GETNEXT並呼叫鉤子子程來重新得到同一個的訊息。新的JournalPlaybackProc呼叫的返回值應該是0;否則,系統將回到休眠狀態,休眠時間是返回值指定的毫秒數,休眠過後再次呼叫JournalPlaybackProc,以此類推。

系統看起來像沒有響應一樣。

和其他全域性的鉤子子程不一樣,JournalRecordProc 和JournalPlaybackProc鉤子子程永遠在設定該鉤子的執行緒的上下文中被呼叫。

在鉤子子程將控制權交還給系統之後,訊息繼續被處理。如果code是HC_SKIP ,鉤子子程必須在下一次被呼叫時返回下一條記錄的事件訊息。

通過指定WH_JOURNALPLAYBACK鉤子型別,以及一個鉤子子程的指標(該子程在SetWindowsHookEx方法中被呼叫)來安裝JournalPlaybackProc鉤子子程。

在鉤子函式處理過程中,如果使用者按下了 CTRL+ESC 或者 CTRL+ALT+DEL組合鍵,系統將停止鉤子處理函式,解除安裝回放鉤子子程,傳遞一個WM_CANCELJOURNAL訊息給應用程式。

如果鉤子子程返回一個在WM_KEYFIRST到WM_KEYLAST範圍內的訊息,EVENTMSG結構的paramL成員指定被按下鍵的虛擬鍵碼。EVENTMSG結構的paramH成員指定掃描碼。

沒有辦法指定重複的計數。事件總是趨於代表一個鍵事件

鉤子(HOOK)函式教程(十五)

方法10 : JournalRecordProc

JournalRecordProc鉤子子程是與SetWindowsHookEx一起使用的、程式定義的或者庫定義的回撥函式。

該方法記錄系統從系統訊息佇列中移除的訊息。過後,應用程式可以使用JournalPlaybackProc鉤子子程回放這些訊息。

HOOKPROC型別定義了指向該回調函式的指標。JournalRecordProc是程式定義的或者庫定義的方法名字。

LRESULT CALLBACK JournalRecordProc(int code,WPARAM wParam,LPARAM lParam);

引數:

code:

指定如何處理訊息。如果code小於0,鉤子子程不對其進行任何進一步的處理,必須將訊息傳遞給CallNextHookEx方法,並返回由CallNextHookEx方法返回的返回值。

該引數可以是以下值之一:

1.HC_ACTION : 引數lParam 是一個指向EVENTMSG結構的指標,該結構包含從系統佇列中移除的訊息的資訊。鉤子子程應該通過將訊息資訊拷貝到緩衝區中或者檔案中來記錄內容。

2.HC_SYSMODALOFF :系統模態對話方塊已經被銷燬。鉤子子程必須恢復紀錄。

3.HC_SYSMODALON :A system-modal dialog box is being displayed. Until the dialog box is destroyed, the hook procedure must stop recording. 系統模態對話方塊正在被顯示。直到對話方塊被銷燬,鉤子處理函式都應該停止記錄。

wParam: 該引數未使用。

lParam :指向EVENTMSG結構的指標,其中包含即將被記錄的訊息。

返回值:返回值會被忽略。

備註:

JournalRecordProc鉤子處理函式只能複製而不能修改訊息。在鉤子子程將控制權交還給系統後,訊息將被繼續處理。

通過下面方式安裝該鉤子子程:指定WH_JOURNALRECORD鉤子型別;指定在呼叫SetWindowsHookEx方法的函式中指向鉤子子程的指標。

JournalRecordProc鉤子處理函式沒必要在動態連結庫中實現,在應用程式中實現即可。

和其它全域性鉤子子程不一樣,JournalRecordProca和 JournalPlaybackProc鉤子子程總是在設定鉤子的執行緒的上下文中被呼叫。

安裝有JournalRecordProc鉤子處理函式的應用程式應該監視VK_CANCEL虛擬鍵碼(在多數鍵盤上就是像CTRL+BREAK一樣實現的組合鍵)。虛擬鍵值應該被應用程式解釋為使用者希望停止記錄。應用程式應該通過結束記錄佇列並且移除JournalRecordProc鉤子處理函式來響應使用者的請求。移除是非常重要的,因為這可以防止該應用程式由於鉤子處理函式內部的掛起而引起的系統鎖死。

CTRL+BREAK組合鍵扮演著停止記錄的訊號的角色,也就是說CTRL+BREAK組合鍵不能被記錄。因為CTRL+C組合鍵沒有扮演這樣的角色,它就可以被記錄。還有其它2種組合鍵不能被記錄: CTRL+ESC 和 CTRL+ALT+DEL。這2種組合鍵引起系統停止所有日誌活動(記錄或者回放),移除所有日誌鉤子,傳遞WM_CANCELJOURNAL訊息給日誌記錄應用程式

鉤子(HOOK)函式教程(十六)

方法11 : KeyboardProc

KeyboardProc鉤子子程是同SetWindowsHookEx方法一起使用的、使用者定義的或者庫定義的回撥函式。無論什麼時候,當應用程式呼叫GetMessage 或者 PeekMessage方法,或者有一個鍵盤訊息(WM_KEYUP或者 WM_KEYDOWN)時,系統都會呼叫該鉤子處理函式。

LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);

引數:

code:

指定鉤子子程使用的程式碼,來決定如何處理該訊息。

如果code小於0,鉤子子程必須將該訊息傳遞給CallNextHookEx方法,自己不進行任何進一步的處理,並且返回由CallNextHookEx方法返回的返回值。

該引數可以是以下值之一:

1.HC_ACTION :引數 wParam 和 lParam 包含有鍵盤敲擊訊息的資訊。

2.HC_NOREMOVE :引數wParam和lParam包含有鍵盤敲擊訊息的資訊,鍵盤敲擊訊息還沒有被從訊息佇列中移除。(應用程式呼叫PeekMessage方法,同時指定PM_NOREMOVE標誌。)

wParam :指定生成鍵盤敲擊訊息的鍵的虛擬鍵碼值。

lParam :指定重複次數,掃描程式碼,擴充套件鍵標誌,上下文程式碼,前期的鍵狀態標誌,轉換狀態標誌。

該引數可下列的一個或者多個值

0-15 : Specifies the repeat count. The value is the number of times the keystroke is repeated as a result of the user's holding down the key. 指定重複的次數。該值是鍵盤敲擊被重複的次數,當用戶持續按住一個鍵時。

16-23 :指定掃描程式碼。該值依賴於OEM。

24 :指定該值是否是一個擴充套件鍵,例如功能鍵或者數字鍵盤上的鍵。如果是擴充套件鍵,該值為1,否則為0。

25-28 : 保留

29 :指定上下文程式碼。如果ALT鍵被按下,該值為1,否則為0。

30 : 指定之前的鍵狀態。如果在訊息發出之前該鍵被按下,值為1;如果鍵彈起,值為0。

31 : 指定轉換狀態。如果鍵正在被按下,該值為0,如果正在被釋放,則為1。

返回值:

如果code小於0,鉤子子程必須返回由CallNextHookEx返回的返回值。如果code大於等於0,並且鉤子子程也沒有處理該訊息,強烈要求呼叫CallNextHookEx方法,並返回它的返回值;否則,其它安裝有WH_KEYBOARD鉤子的應用程式將收不到鉤子通知,可能導致行為的錯誤。如果鉤子子程處理了該訊息,可能返回一個非0值,用來阻止系統將該訊息傳遞給鉤子連結串列中的其它鉤子或者目的窗體程式。

備註:

應用程式通過下面的方法安裝該鉤子子程: 指定WH_KEYBOARD鉤子型別;指定在呼叫SetWindowsHookEx的方法中的一個指向鉤子子程的指標。

鉤子(HOOK)函式教程(十七)

(2011-02-13 00:14:30) 轉載
標籤:

雜談

分類:Hook函式教程

方法12 : LowLevelKeyboardProc

每次有新的鍵盤輸入事件要被傳遞給一個執行緒輸入佇列時,系統會呼叫該方法。

鍵盤輸入可以來自本地鍵盤驅動,也可以來自對keybd_event事件的呼叫。

如果輸入來自對keybd_event事件的呼叫,那麼輸入是被“注入”的。

然而,WH_KEYBOARD_LL鉤子不被注入到其它程序中,相反上下文會切換回安裝鉤子的程序,該鉤子就會在原始的上下文中被呼叫,然後,上下文切換回生成該事件的應用程式中。

LRESULT CALLBACK LowLevelKeyboardProc(int nCode,WPARAM wParam,LPARAM lParam );

引數:

nCode :指定鉤子子程使用的程式碼,鉤子子程使用該值決定如何處理訊息。

如果nCode小於0,鉤子子程必須將訊息傳遞給CallNextHookEx方法,自己不做進一步的處理,並且要返回由方法CallNextHookEx返回的的返回值。

該引數可以是下列值之一

1.HC_ACTION :引數wParam和lParam包含有和鍵盤訊息相關的資訊。

wParam :指定鍵盤訊息的識別符號。該引數可以是以下引數之一: WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, or WM_SYSKEYUP.

lParam :指向KBDLLHOOKSTRUCT結構的指標。

返回值:

如果nCode小於0,鉤子子程必須返回由方法CallNextHookEx返回的返回值。如果nCode大於等於0,並且鉤子子程還沒有處理訊息,強烈建議呼叫CallNextHookEx方法,返回由它返回的返回值;否則,其它已經安裝了WH_KEYBOARD_LL 鉤子的應用程式將接收不到鉤子通知,可能導致行為的錯誤。如果鉤子子程已經處理了該訊息,就返回一個非0值來阻止系統將訊息傳遞給鉤子連結串列中的其他鉤子,或者目的窗體程式。

備註:

應用程式通過下面的方法安裝鉤子子程:指定WH_KEYBOARD_LL鉤子型別;指定在呼叫SetWindowsHookEx的方法中的指向鉤子子程的指標

鉤子在安裝它的執行緒的上下文中被呼叫。通過傳送訊息給安裝該鉤子的執行緒來實現呼叫。因此,安裝有該鉤子的執行緒必須有訊息迴圈。

鉤子處理函式應該用比下面時間少的時間來處理訊息:在登錄檔的HKEY_CURRENT_USER\Control Panel\Desktop鍵的 LowLevelHooksTimeout值指定的時間,該值是以毫秒為單位的。

如果鉤子處理函式在這個間隔內沒有返回,系統將把訊息傳遞給下一個鉤子。

注意:除錯鉤子不能跟蹤該型別的鉤子。

鉤子(HOOK)函式教程(十八)

(2011-02-12 17:39:41) 轉載
標籤:

雜談

分類:Hook函式教程

方法13 : LowLevelMouseProc

系統在每次有新的滑鼠輸入事件即將被傳遞給執行緒輸入佇列時,呼叫該方法。

滑鼠輸入可以來自本地滑鼠驅動或者對mouse_event方法的呼叫。

如果輸入來自對mouse_event的呼叫,該輸入就是被“注入”。

因為WH_MOUSE_LL鉤子不能被注入到其他程序。所以上下文會切換回安裝該鉤子的程序,該鉤子會在原始的上下文中被呼叫。

然後,上下文切換回生成該事件的應用程式中。

LRESULT CALLBACK LowLevelMouseProc(int nCode,WPARAM wParam,LPARAM lParam );

引數:

nCode :指定鉤子子程如何處理該訊息。

如果nCode小於0,鉤子子程必須將訊息傳遞給CallNextHookEx方法,自己不進行進一步的處理,並且應該返回由方法CallNextHookEx返回的返回值。

引數可以是下列值之一:

1.HC_ACTION :wParam 和 lParam 引數包含有滑鼠訊息的資訊。

wParam :指定滑鼠訊息的識別符號。引數可以是以下訊息之一: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_RBUTTONDOWN, WM_RBUTTONUP.

lParam :指向MSLLHOOKSTRUCT結構的指標。

返回值:如果nCode小於0,鉤子子程必須返回由方法CallNextHookEx返回的返回值。

如果nCode大於等於0,而且鉤子子程沒有處理該訊息,那麼強烈要求呼叫方法CallNextHookEx並返回由它返回的返回值;否則,其它已經安裝了WH_MOUSE_LL鉤子的應用程式將收不到鉤子通知,可能導致行為的錯誤。如果鉤子子程已經處理了該訊息,應該返回一個非0值,用來阻止系統將訊息傳遞給鉤子連結串列中的其它鉤子或者目標窗體程式。

備註:

該鉤子在安裝它的執行緒的上下文中被呼叫。通過傳送訊息給安裝鉤子的執行緒來實現呼叫。因此,安裝鉤子的執行緒必須有訊息迴圈。

鉤子子程應該用比下面時間少的時間來處理訊息: 在登錄檔的HKEY_CURRENT_USER\Control Panel\Desktop鍵的 LowLevelHooksTimeout值指定的時間(該值是以毫秒為單位的)。

如果鉤子子程在這個間隔沒有返回,系統將把訊息傳遞給下一個鉤子。

注意:除錯鉤子不能追蹤該型別的鉤子

鉤子(HOOK)函式教程(十九)

(2011-02-12 17:37:26) 轉載
標籤:

雜談

分類:Hook函式教程

方法14 :MessageProc

在對話方塊,訊息框,選單,滾動條的輸入事件發生後、在這些輸入事件生成的訊息被處理之前,系統會呼叫該方法。

鉤子子程可以監視特定的程式或者所有程式生成的對話方塊,訊息框,選單或者滾動條的訊息。

LRESULT CALLBACK MessageProc(int code, WPARAM wParam,LPARAM lParam );

引數:

指定生成訊息的輸入事件的型別。

如果code小於0,鉤子子程必須將訊息傳遞給CallNextHookEx方法,自己不進行任何進一步處理,並且要返回由方法CallNextHookEx返回的返回值。

該引數可以時下列方法之一:

1.MSGF_DDEMGR :當DDEML(Dynamic Data Exchange Management Library)正在等待同步傳輸結束時,該輸入事件發生。

2.MSGF_DIALOGBOX :輸入事件在訊息框或者對話方塊中發生。

3.MSGF_MENU :The input event occurred in a menu. 輸入事件在選單中發生。

4.MSGF_SCROLLBAR :輸入事件在滾動條中發生。

wParam: 該引數未被使用。

lParam :指向MSG結構的指標。

返回值:

如果code小於0,鉤子子程必須返回由方法CallNextHookEx返回的返回值。

如果code大於等於0,而且鉤子子程還沒有處理該訊息,強烈要求呼叫CallNextHookEx方法並返回由它返回的返回值;否則,其它已經安裝了WH_MSGFILTER鉤子的應用程式將收不到鉤子通知,可能導致行為的錯誤。如果鉤子子程已經處理了該訊息,應該返回非0值,以阻止系統將訊息傳遞給鉤子連結串列中剩下的鉤子或者目標視窗子程。

備註:

使用DDEML、執行同步傳遞的應用程式必須在訊息被分發前進行處理,並且必須使用WH_MSGFILTER鉤子

鉤子(HOOK)函式教程(二十)

(2011-02-12 17:33:57) 轉載
標籤:

雜談

分類:Hook函式教程

方法15 :MouseProc

無論什麼時候,當應用程式一呼叫GetMessage 或者 PeekMessage方法,並且滑鼠訊息即將被處理時,系統就呼叫該方法。

LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam);

引數:

nCode :指定鉤子子程使用的用來決定如何處理訊息的碼值。

如果nCode小於0,鉤子子程必須將訊息傳遞給CallNextHookEx方法,自己不進行進一步的處理,並且要返回由CallNextHookEx方法返回的返回值。

該引數可以是下列值之一:

1.HC_ACTION :引數wParam 和 lParam包含和滑鼠訊息相關的資訊。

2.HC_NOREMOVE :引數wParam 和 lParam包含和滑鼠訊息相關的資訊,並且滑鼠訊息還沒有從訊息佇列中移除(應用程式呼叫PeekMessage時,制定PM_NOREMOVE標誌位)。

wParam :指定滑鼠訊息的識別符號。

lParam:指向MOUSEHOOKSTRUCT結構的指標。

返回值:

如果code小於0,鉤子子程必須返回由CallNextHookEx方法返回的返回值。

如果code大於等於0,並且鉤子子程沒有處理該訊息,強烈要求呼叫CallNextHookEx方法並返回由它返回的返回值;

否則,其它已經安裝了WH_MOUSE鉤子的應用程式將收不到鉤子通知,可能導致行為的錯誤。

如果鉤子子程已經處理了該訊息,應該返回非0值,以阻止系統將訊息傳遞給鉤子連結串列中剩餘的鉤子或者目標窗體程式。

備註:

該鉤子處理函式 禁止 安裝在WH_JOURNALPLAYBACK鉤子的回撥函式中

鉤子(HOOK)函式教程(二十一)

(2011-02-12 17:28:13) 轉載
標籤:

雜談

分類:Hook函式教程

方法16 :SetWindowsHookEx

SetWindowsHookEx方法安裝一個應用程式定義的鉤子處理函式到鉤子連結串列中。你可以安裝鉤子處理函式來監視系統的一些型別的事件。這些事件與執行緒繫結:某個特定的執行緒或者與呼叫執行緒處於同一桌面下的所有執行緒。

HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId);

引數:

idHook :指定即將被安裝的鉤子處理函式的型別。該引數可以是下列值之一:

1.WH_CALLWNDPROC :安裝一個鉤子處理函式,用來在系統將訊息傳送給目的窗體程式之前監視訊息。

2.WH_CALLWNDPROCRET :安裝一個鉤子處理函式,用來在訊息被目標窗體程式處理之後來監視訊息。

3.WH_CBT :安裝一個鉤子處理函式,用來接收對CBT程式有用的通知。

4.WH_DEBUG :安裝一個用於除錯其它鉤子處理函式的鉤子處理函式。

5.WH_FOREGROUNDIDLE :安裝一個鉤子處理函式,當應用程式的前臺執行緒即將空閒時,該處理函式被呼叫。該鉤子型別對於在應用程式空閒時間處理低優先級別的任務非常有用。

5.WH_GETMESSAGE :安裝一個鉤子處理函式用來監視投遞給訊息佇列的訊息。

6.WH_JOURNALPLAYBACK :安裝一個鉤子處理函式用來投遞之前由WH_JOURNALRECORD鉤子處理函式記錄的訊息。

7.WH_JOURNALRECORD :安裝一個鉤子處理函式來記錄投遞給系統訊息佇列的輸入訊息。該鉤子對記錄巨集很有用。

8.WH_KEYBOARD :安裝一個鉤子處理函式用來監視鍵盤訊息。

9.WH_KEYBOARD_LL :在Windows NT/2000/XP環境下:安裝一個鉤子處理函式用來監視低層鍵盤輸入事件。

10.WH_MOUSE :安裝一個鉤子處理函式用來監視滑鼠訊息。

11.WH_MOUSE_LL :在 Windows NT/2000/XP環境下,安裝一個鉤子處理函式用來監視低層滑鼠輸入事件。

12.WH_MSGFILTER :安裝一個鉤子處理函式用來監視下列物件的輸入事件產生的訊息:對話方塊、訊息框、選單、滾動條。

13.WH_SHELL :安裝一個鉤子處理函式用來接收Shell程式相關的通知。

14.WH_SYSMSGFILTER :安裝一個鉤子處理函式用來監視下列物件的輸入事件產生的訊息:對話方塊、訊息框、選單、滾動條。鉤子處理函式監視與呼叫執行緒處於同一桌面下的所有應用程式。

lpfn :指向鉤子處理函式的指標。如果引數dwThreadId為0或者指定由不同程序建立的執行緒的ID,那麼lpfn引數必須指向動態連結庫裡的鉤子處理函式。

否則,lpfn可以指向當前程序中的鉤子處理函式。

hMod :DLL的控制代碼,其中包含由lpfn引數指向的鉤子處理函式。

如果引數dwThreadId指定的執行緒屬於當前的程序,並且購置處理函式業主當前的程序,hMod引數必須設定為Null。

dwThreadId :指定鉤子處理函式要監視的執行緒ID。

如果該引數是0,鉤子處理函式監視與呼叫執行緒處於同一桌面環境下的所有執行緒。

返回值:如果方法執行成功,返回鉤子處理函式的控制代碼。如果失敗,返回NULL。

備註:

SetWindowsHookEx可以用來將一個DLL注入到其他的程序中。

32位的DLL不能被注入到64位的程序中,同樣,64位的DLL也不能被注入到32位的程序中。

如果應用程式需要在其它的程序中使用鉤子,那麼必須遵從:32位的應用程式呼叫SetWindowsHookEx將32位的DLL注入到32位的程序中,64位的應用程式呼叫SetWindowsHookEx將64位的DLL注入到64位的程序中。

32位的DLL和64位的DLL必須具有不同的名稱。

如果引數hMod為空,引數dwThreadId為0或者指定了由另外程序建立的執行緒ID,就可能會產生錯誤。

雖然呼叫CallNextHookEx方法連結到下一個鉤子處理函式是可選的,但是強烈建議這麼做;

否則,其它已經安裝了鉤子的應用程式將不接收鉤子通知,可能導致行為錯誤。

除非你完全確定需要阻止其它應用程式得到通知,否則都應該呼叫CallNextHookEx方法。

在應用程式結束前,應用程式必須呼叫UnhookWindowsHookEx方法來釋放與該鉤子相關的系統資源。

鉤子的作用域取決於鉤子的型別。一些鉤子只能是全域性範圍的,其它一些僅僅能在指定的執行緒中使用。

如下表所示:

Hook

Scope

WH_CALLWNDPROC

Thread or global

WH_CALLWNDPROCRET

Thread or global

WH_CBT

Thread or global

WH_DEBUG

Thread or global

WH_FOREGROUNDIDLE

Thread or global

WH_GETMESSAGE

Thread or global

WH_JOURNALPLAYBACK

Global only

WH_JOURNALRECORD

Global only

WH_KEYBOARD

Thread or global

WH_KEYBOARD_LL

Global only

WH_MOUSE

Thread or global

WH_MOUSE_LL

Global only

WH_MSGFILTER

Thread or global

WH_SHELL

Thread or global

WH_SYSMSGFILTER

Global only

對於指定的鉤子型別,執行緒鉤子先被呼叫,然後是全域性鉤子。

全域性鉤子是共享資源,安裝一個鉤子會影響同一桌面環境下做為呼叫執行緒的所有應用程式。所有的全域性鉤子函式都應該在Libraries中。全域性鉤子應該被分發到特定目的的應用程式中,或者在程式除錯中間,來輔助開發。不再需要鉤子的庫應該移除鉤子處理函式。

鉤子(HOOK)函式教程(二十二)

(2011-02-12 17:19:48) 轉載
標籤:

雜談

分類:Hook函式教程

方法17 :ShellProc Function

The ShellProc hook procedure is an application-defined or library-defined callback function used with the SetWindowsHookEx function. The function receives notifications of Shell events from the system.

copyright 智動軟體

The HOOKPROC type defines a pointer to this callback function. ShellProc is a placeholder for the application-defined or library-defined function name.

內容來自zdwork.cn

ShellProc鉤子子程是同SetWindowsHookEx一起使用的、應用程式定義的或者庫定義的回撥函式。該方法接收來自系統的加殼事件通知。HOOKPROC型別定義了指向該方法的指標。ShellProc是應用程式定義的或者庫定義的方法的名字。本文來自智動軟體zdwork.cn

Syntax 語法 本文來自智動軟體zdwork.cn

LRESULT CALLBACK ShellProc(

本文來自智動軟體zdwork.cn

int nCode,內容來自zdwork.cn

WPARAM wParam,zdwork.cn

LPARAM lParam 智動軟體

);

智動軟體

Parameters引數內容來自zdwork.cn

nCode:[in]Specifies the hook code. IfnCodeis less than zero, the hook procedure must pass the message to the CallNextHookEx function without further processing and should return the value returned by CallNextHookEx. This parameter can be one of the following values. www.zdwork.cn

指定鉤子程式碼。如果nCode小於0,鉤子子程必須將訊息傳遞給CallNextHookEx方法,自己不進行進一步的處理,並且應該返回由CallNextHookEx方法返回的返回值。該引數可以是下列值: 內容來自zdwork.cn

1.HSHELL_ACCESSIBILITYSTATE 智動軟體

Windows 2000/XP: The accessibility state has changed. 可訪問性已經改2.HSHELL_ACTIVATESHELLWINDOW

zdwork.cn

The shell should activate its main window. 外殼應該啟用它的主視窗。3.HSHELL_APPCOMMAND

zdwork.cn

Windows 2000/XP: The user completed an input event (for example, pressed an application command button on the mouse or an application command key on the keyboard), and the application did not handle the WM_APPCOMMAND message generated by that input. zdwork.cn

使用者完成一個輸入事件(例如,按下應用程式滑鼠上的命令按鈕或者鍵盤上的命令鍵),應用程式沒有處理由該輸入產生的WM_APPCOMMAND 訊息。

copyright 智動軟體

If the Shell procedure handles the WM_COMMAND message, it should not call CallNextHookEx. See the Return Value section for more information.

www.zdwork.cn

如果Shell子程獲得了WM_COMMAND訊息的控制代碼,不應該呼叫CallNextHookEx 。

www.zdwork.cn

4.HSHELL_GETMINRECT

本文來自智動軟體zdwork.cn

A window is being minimized or maximized. The system needs the coordinates of the minimized rectangle for the window. 視窗正在被最小化或者最大化。系統需要窗體的最小矩形框的座標。智動軟體

5.HSHELL_LANGUAGE本文來自智動軟體zdwork.cn

Keyboard language was changed or a new keyboard layout was loaded.鍵盤語言被改變了或者新的鍵盤佈局被載入了。www.zdwork.cn

6.HSHELL_REDRAW copyright 智動軟體

The title of a window in the task bar has been redrawn. 工作列中的視窗標題被重繪了。

copyright 智動軟體

7.HSHELL_TASKMAN 智動軟體

The user has selected the task list. A shell application that provides a task list should return TRUE to prevent Microsoft Windows from starting its task list. 使用者選擇了任務列表。提供了任務列表的加殼應用程式應該返回TRUE,來阻止windows啟動任務列表。智動軟體

8.HSHELL_WINDOWACTIVATED

本文來自智動軟體zdwork.cn

The activation has changed to a different top-level, unowned window. 啟用動作變成了不同的top-level,unowned 的視窗。(即,激活了不同的不明視窗,使其處於最上層。) 內容來自zdwork.cn

9.HSHELL_WINDOWCREATED 智動軟體

A top-level, unowned window has been created. The window exists when the system calls this hook. 頂層的、不受控制的窗體已經被建立。當系統呼叫該鉤子時,視窗存在。內容來自zdwork.cn

10.HSHELL_WINDOWDESTROYED 本文來自智動軟體zdwork.cn

A top-level, unowned window is about to be destroyed. The window still exists when the system calls this hook. 頂層的、不受控制的窗體即將被銷燬。當系統呼叫該鉤子的時候該窗體依然存在。

內容來自zdwork.cn

11.HSHELL_WINDOWREPLACED本文來自智動軟體zdwork.cn

Windows XP: A top-level window is being replaced. The window exists when the system calls this hook. 在Windows XP環境下,頂層的窗體正在被替換掉。當系統呼叫該鉤子時,視窗存在。內容來自zdwork.cn

wParamwww.zdwork.cn

[in]The value depends on the value of thenCodeparameter, as shown in the following table.該值取決於引數nCode,如下表所示。 www.zdwork.cn

nCodecopyright 智動軟體

wParam本文來自智動軟體zdwork.cn

HSHELL_ACCESSIBILITYSTATE

copyright 智動軟體

Windows 2000/XP: Indicates which accessibility feature has changed state. This value is one of the following: ACCESS_FILTERKEYS,ACCESS_MOUSEKEYS, or ACCESS_STICKYKEYS.智動軟體

在Windows XP 環境下:指示哪種訪問特徵已經被改變了狀態。值可以是下列之一:ACCESS_FILTERKEYS,ACCESS_MOUSEKEYS, ACCESS_STICKYKEYS.copyright 智動軟體

HSHELL_APPCOMMANDzdwork.cn

Windows 2000/XP: Where the WM_APPCOMMAND message was originally sent; for example, the handle to a window.本文來自智動軟體zdwork.cn

是WM_APPCOMMAND訊息最初發出的位置,例如,視窗的控制代碼。

內容來自zdwork.cn

HSHELL_GETMINRECT 智動軟體

Handle to the minimized or maximized window.最小化或者最大化的窗體的控制代碼。

智動軟體

HSHELL_LANGUAGE本文來自智動軟體zdwork.cn

Handle to the window.視窗控制代碼。

智動軟體

HSHELL_REDRAW本文來自智動軟體zdwork.cn

Handle to the redrawn window.重化視窗控制代碼。

智動軟體

HSHELL_WINDOWACTIVATED

zdwork.cn

Handle to the activated window.活動視窗控制代碼。

www.zdwork.cn

HSHELL_WINDOWCREATED智動軟體

Handle to the created window.被建立的視窗的控制代碼。

zdwork.cn

HSHELL_WINDOWDESTROYED

智動軟體

Handle to the destroyed window.被銷燬的視窗的控制代碼。

本文來自智動軟體zdwork.cn

HSHELL_WINDOWREPLACED 內容來自zdwork.cn

Windows XP: Handle to the window being replaced.即將被替換的窗體的控制代碼。本文來自智動軟體zdwork.cn

lParamcopyright 智動軟體

[in]The value depends on the value of thenCodeparameter, as shown in the following table. 該值取決於引數nCode。如下表所示。智動軟體

nCodezdwork.cn

lParam

www.zdwork.cn

HSHELL_APPCOMMAND

內容來自zdwork.cn

Windows 2000/XP:GET_APPCOMMAND_LPARAM(lParam) is the application command corresponding to the input event.智動軟體

GET_APPCOMMAND_LPARAM是對輸入事件做出響應的應用程式命令。 zdwork.cn

GET_DEVICE_LPARAM(lParam) indicates what generated the input event; for example, the mouse or keyboard.

copyright 智動軟體

GET_DEVICE_LPARAM指示是什麼生成了輸入事件。例如,滑鼠或者鍵盤。

www.zdwork.cn

GET_FLAGS_LPARAM(lParam) depends on the value of cmd in WM_APPCOMMAND. For example, it might indicate which virtual keys were held down when the WM_APPCOMMAND message was originally sent. GET_FLAGS_LPARAM(lParam)依賴於 WM_APPCOMMAND中CMD的值。例如,可以指示當WM_APPCOMMAND訊息被髮出的時候,哪個虛擬鍵被按下。

copyright 智動軟體

copyright 智動軟體

HSHELL_GETMINRECTzdwork.cn

Pointer to a RECT structure. RECT結構的指標

本文來自智動軟體zdwork.cn

HSHELL_LANGUAGEwww.zdwork.cn

Handle to a keyboard layout. 鍵盤佈局的控制代碼。

本文來自智動軟體zdwork.cn

HSHELL_REDRAWwww.zdwork.cn

The value is TRUE if the window is flashing, or FALSE otherwise. 如果視窗正在閃爍(重繪過程中),該值為true,其他為false內容來自zdwork.cn

HSHELL_WINDOWACTIVATED zdwork.cn

The value is TRUE if the window is in full-screen mode, or FALSE otherwise. 如果窗體處於全屏模式,該值是true,否則為false。

本文來自智動軟體zdwork.cn

HSHELL_WINDOWREPLACED

智動軟體

Windows XP: Handle to the new window.新窗體的控制代碼。 copyright 智動軟體

Return Value返回值本文來自智動軟體zdwork.cn

The return value should be zero unless the value ofnCodeis HSHELL_APPCOMMAND and the shell procedure handles the WM_COMMAND message. In this case, the return should be nonzero.

zdwork.cn

如果nCode的值是HSHELL_APPCOMMAND,shell子程控制代碼指向WM_COMMAND 訊息,在這種情況下,返回值是非0。其他情況下,返回值是0。 copyright 智動軟體

Remarks備註 zdwork.cn

Install this hook procedure by specifying the WH_SHELL hook type and a pointer to the hook procedure in a call to the SetWindowsHookEx function. 通過指定WH_SHELL 鉤子型別以及在SetWindowsHookEx的方法中的指向鉤子子程的指標來安裝該鉤子子程

鉤子(HOOK)函式教程(二十三)

(2011-02-12 17:13:46) 轉載
標籤:

雜談

分類:Hook函式教程

方法18 :SysMsgProc Function

智動軟體

The SysMsgProc hook procedure is a library-defined callback function used with the SetWindowsHookEx function. The system calls this function after an input event occurs in a dialog box, message box, menu, or scroll bar, but before the message generated by the input event is processed. The function can monitor messages for any dialog box, message box, menu, or scroll bar in the system. 本文來自智動軟體zdwork.cn

SysMsgProc鉤子子程是同SetWindowsHookEx一起使用的在庫中定義的回撥函式。在對話方塊、訊息框、選單、滾動條中所屬的輸入事件發生後,在這些訊息被系統處理之前,系統呼叫該方法。該方法能夠為系統中任何對話方塊、訊息框、選單、滾動條監視訊息。

copyright 智動軟體

The HOOKPROC type defines a pointer to this callback function. SysMsgProc is a placeholder for the application-defined or library-defined function name. 內容來自zdwork.cn

HOOKPROC型別定義了回撥函式的指標,SysMsgProc是應用程式定義的或者庫定義的方法的名字。 copyright 智動軟體

Syntax語法www.zdwork.cn

LRESULTCALLBACKSysMsgProc( intnCode,copyright 智動軟體
WPARAMwParam, 智動軟體
LPARAMlParam copyright 智動軟體
); zdwork.cn

Parameters引數 本文來自智動軟體zdwork.cn

nCode

內容來自zdwork.cn

[in]Specifies the type of input event that generated the message. IfnCodeis less than zero, the hook procedure must pass the message to the CallNextHookEx function without further processing and should return the value returned by CallNextHookEx. This parameter can be one of the following values. 指定生成該訊息的輸入事件的型別。如果nCode小於0,鉤子子程必須將訊息傳遞給CallNextHookEx方法,自己不進行進一步的處理,並且應該返回由CallNextHookEx方法返回的返回值。。該引數可以是以下值之一: zdwork.cn

1.MSGF_DIALOGBOX :The input event occurred in a message box or dialog box. 輸入事件在訊息框或者對話方塊中發生。

copyright 智動軟體

2.MSGF_MENU :The input event occurred in a menu.輸入事件在選單中發生。

zdwork.cn

3.MSGF_SCROLLBAR :The input event occurred in a scroll bar.輸入事件在滾動條中發生。 內容來自zdwork.cn

wParam:This parameter is not used. 該引數未使用。

內容來自zdwork.cn

lParam:[in]Pointer to an MSG message structure.指向MSG訊息結構的指標。 智動軟體

Return Value 返回值 智動軟體

IfnCodeis less than zero, the hook procedure must return the value returned by CallNextHookEx.本文來自智動軟體zdwork.cn

IfnCodeis greater than or equal to zero, and the hook procedure did not process the message, it is highly recommended that you call CallNextHookEx and return the value it returns; otherwise, other applications that have installed WH_SYSMSGFILTER hooks will not receive hook notifications and may behave incorrectly as a result. If the hook procedure processed the message, it may return a nonzero value to prevent the system from passing the message to the target window procedure.

www.zdwork.cn

如果nCode小於0,鉤子子程必須返回由CallNextHookEx方法返回的返回值。如果nCode大於等於0,並且鉤子子程還沒有處理該訊息,強烈要求呼叫CallNextHookEx方法並返回由它返回的返回值。否則,其他已經安裝了WH_SYSMSGFILTER鉤子的應用程式將接收不到鉤子通知,可能導致行為錯誤。如果鉤子子程已經處理了該訊息,應該返回非0 值,來阻止系統將訊息傳遞給目標窗體程式。 www.zdwork.cn

Remarks備註 智動軟體

An application installs the hook procedure by specifying the WH_SYSMSGFILTER hook type and a pointer to the hook procedure in a call to the SetWindowsHookEx function.

智動軟體

應用程式安裝該鉤子通過:指定WH_SYSMSGFILTER鉤子型別;指定在呼叫SetWindowsHookEx方法的指向鉤子子程的指標

鉤子(HOOK)函式教程(二十四)

(2011-02-12 16:45:53) 轉載
標籤:

雜談

分類:Hook函式教程

方法19 :UnhookWindowsHookEx Functionwww.zdwork.cn

The UnhookWindowsHookEx function removes a hook procedure installed in a hook chain by the SetWindowsHookEx function.

內容來自zdwork.cn

UnhookWindowsHookEx方法移除由SetWindowsHookEx方法安裝在鉤子連結串列中的鉤子子程。

copyright 智動軟體

Syntax語法

copyright 智動軟體

BOOLUnhookWindowsHookEx(HHOOKhhk); www.zdwork.cn

Parameters 引數

copyright 智動軟體

hhk:[in]Handle to the hook to be removed. This parameter is a hook handle obtained by a previous call to SetWindowsHookEx. 即將被移除的鉤子的控制代碼。該引數是由前面呼叫SetWindowsHookEx的方法所保留的鉤子控制代碼。

智動軟體

Return Value 返回值

copyright 智動軟體

If the function succeeds, the return value is nonzero.智動軟體

If the function fails, the return value is zero. To get extended error information, call GetLastError.

www.zdwork.cn

如果該方法執行成功,返回非0值。如果解除安裝失敗,返回0。呼叫GetLastError可以得到更多的錯誤資訊。copyright 智動軟體

Remarks備註

本文來自智動軟體zdwork.cn

The hook procedure can be in the state of being called by another thread even after UnhookWindowsHookEx returns. If the hook procedure is not being called concurrently, the hook procedure is removed immediately before UnhookWindowsHookEx returns.

內容來自zdwork.cn

在UnhookWindowsHookEx方法返回後,鉤子子程可能處於正在被其他執行緒呼叫的狀態。如果鉤子子程不是被併發呼叫,鉤子子程會在UnhookWindowsHookEx方法返回前被迅速的移除

鉤子(HOOK)函式教程(二十五)

(2011-02-12 15:49:23) 轉載
標籤:

雜談

分類:Hook函式教程

下面是各種Notification即通知。 copyright 智動軟體

通知1:WM_CANCELJOURNAL Notification 本文來自智動軟體zdwork.cn

The WM_CANCELJOURNAL message is posted to an application when a user cancels the application's journaling activities. The message is posted with a NULL window handle.

智動軟體

當用戶取消應用程式的日誌記錄活動時,WM_CANCELJOURNAL訊息被傳遞給應用程式。該訊息以空窗體控制代碼的方式來傳遞。 www.zdwork.cn

Syntax :WM_CANCELJOURNAL

本文來自智動軟體zdwork.cn

Return Value 返回值 智動軟體

This message does not return a value. It is meant to be processed from within an application's main loop or a GetMessage hook procedure, not from a window procedure.

內容來自zdwork.cn

該訊息沒有返回值。這意味著在應用程式的主迴圈中被處理,或者在GetMessage鉤子子程內被處理,而不是在窗體程式中被處理。智動軟體

Remarks 備註

copyright 智動軟體

Journal record and playback modes are modes imposed on the system that let an application sequentially record or play back user input. The system enters these modes when an application installs a JournalRecordProc or JournalPlaybackProc hook procedure. When the system is in either of these journaling modes, applications must take turns reading input from the input queue. If any one application stops reading input while the system is in a journaling mode, other applications are forced to wait.

內容來自zdwork.cn

日誌記錄和回放模式是強加在系統上的模式,它們使應用程式序列化記錄和回放使用者的輸入。當應用程式安裝JournalRecordProc 和JournalPlaybackProc鉤子子程時,系統就進入這樣的模式。當系統處於這些模式中的任意一個時,應用程式必須輪流從輸入佇列讀入輸入。當系統處於記錄模式時,如果任何一個應用程式停止讀取輸入,其他應用程式被迫要等待。

zdwork.cn

To ensure a robust system, one that cannot be made unresponsive by any one application, the system automatically cancels any journaling activities when a user presses CTRL+ESC or CTRL+ALT+DEL. The system then unhooks any journaling hook procedures, and posts a WM_CANCELJOURNAL message, with a NULL window handle, to the application that set the journaling hook. 本文來自智動軟體zdwork.cn

為了保證系統的強壯性,一個應用程式不能因為其他應用程式的影響而失去響應。當用戶按下時CTRL+ESC 或者CTRL+ALT+DEL時,系統自動取消任何記錄行為,然後系統解除安裝任何記錄鉤子子程,向安裝該記錄鉤子的應用程式傳遞一個WM_CANCELJOURNAL訊息,該訊息含有一個空窗體控制代碼,www.zdwork.cn

The WM_CANCELJOURNAL message has a NULL window handle, therefore it cannot be dispatched to a window procedure. There are two ways for an application to see a WM_CANCELJOURNAL message: If the application is running in its own main loop, it must catch the message between its call to GetMessage or PeekMessage and its call to DispatchMessage. If the application is not running in its own main loop, it must set a GetMsgProc hook procedure (through a call to SetWindowsHookEx specifying the WH_GETMESSAGE hook type) that watches for the message.

智動軟體

WM_CANCELJOURNAL訊息包含一個空窗體控制代碼,因此不能被分派給窗體程式。應用程式有2種方式可以檢視WM_CANCELJOURNAL訊息:如果應用程式在它自己的主迴圈下執行,必須在它呼叫GetMessage或者PeekMessage與DispatchMessage之間,捕獲該訊息。如果應用程式沒有執行在自己的主迴圈下,必須設定tMsgProc鉤子子程(通過指定WH_GETMESSAGE鉤子型別呼叫dowsHookEx)來監視訊息。 智動軟體

When an application sees a WM_CANCELJOURNAL message, it can assume two things: the user has intentionally cancelled the journal record or playback mode, and the system has already unhooked any journal record or playback hook procedures.

本文來自智動軟體zdwork.cn

當應用程式檢視WM_CANCELJOURNAL訊息時,可以假設2件事情:使用者已經特意取消了記錄和回放模式,並且,系統已經解除安裝了任何記錄或者回放鉤子子程。

內容來自zdwork.cn

Note that the key combinations mentioned above (CTRL+ESC or CTRL+ALT+DEL) cause the system to cancel journaling. If any one application is made unresponsive, they give the user a means of recovery. The VK_CANCEL virtual key code (usually implemented as the CTRL+BREAK key combination) is what an application that is in journal record mode should watch for as a signal that the user wishes to cancel the journaling activity. The difference is that watching for VK_CANCEL is a suggested behavior for journaling applications, whereas CTRL+ESC or CTRL+ALT+DEL cause the system to cancel journaling regardless of a journaling application's behavior.zdwork.cn

注意: 前面提到的組合鍵(CTRL+ESC 或者CRL+ALT+DEL)會導致系統停止記錄。如果任何一個應用程式無響應,它們給使用者提供了一種恢復的方式。虛擬鍵值VK_CANCEL(通常以 CTRL+BREAK來實現)是任何一個處於日誌記錄模式的應用程式都應該監視的,該值被用作使用者希望取消記錄活動的訊號。不同之處在於,記錄型應用程式監視VK_CANCEL是一種建議,但是CTRL+ESC 或者CTRL+ALT+DEL引發系統取消記錄,忽略監視型應用程式的行為

鉤子(HOOK)函式教程(二十六)

(2011-02-12 14:19:03) 轉載
標籤:

雜談

分類:Hook函式教程

通知2:WM_QUEUESYNC Notification智動軟體

The WM_QUEUESYNC message is sent by a computer-based training (CBT) application to separate user-input messages from other messages sent through the WH_JOURNALPLAYBACK Hook procedure.zdwork.cn

WM_QUEUESYNC訊息是由CBT應用程式送出的,用來區分使用者輸入的訊息和其它由WH_JOURNALPLAYBACK鉤子子程發出的訊息。 www.zdwork.cn

Syntax :WM_QUEUESYNC本文來自智動軟體zdwork.cn

Return Value 返回值 www.zdwork.cn

A CBT application should return zero if it processes this message.

copyright 智動軟體

如果CBT應用程式處理該訊息,返回值應該是0。

智動軟體

Remarks 備註 zdwork.cn

Whenever a CBT application uses the WH_JOURNALPLAYBACK Hook procedure, the first and last messages are WM_QUEUESYNC. This allows the CBT application to intercept and examine user-initiated messages without doing so for events that it sends.內容來自zdwork.cn

If an application specifies a NULL window handle, the message is posted to the message queue of the active window.www.zdwork.cn

不管CBT應用程式什麼時候使用WH_JOURNALPLAYBACK鉤子子程,第一個和最後一個訊息都是WM_QUEUESYNC.這樣的話,CBT應用程式就能夠擷取、檢驗使用者初始化的訊息,而不需要對它自己送出的程式也這樣做。

鉤子(HOOK)函式教程(二十七)

(2011-02-12 13:46:03) 轉載
標籤:

雜談

分類:Hook函式教程

下面是應用Hook時會用到的各種結構。 智動軟體

結構1:CBT_CREATEWND Structurezdwork.cn

The CBT_CREATEWND structure contains information passed to a WH_CBT hook procedure, CBTProc, before a window is created. 本文來自智動軟體zdwork.cn

該結構包含有:在一個視窗被建立之前傳遞給WH_CBT鉤子子程,即CBTProc,的資訊。www.zdwork.cn

Syntaxy語法 本文來自智動軟體zdwork.cn

typedef struct {copyright 智動軟體
LPCREATESTRUCTlpcs; 智動軟體
HWNDhwndInsertAfter;www.zdwork.cn
} CBT_CREATEWND, *LPCBT_CREATEWND; www.zdwork.cn

Members成員

copyright 智動軟體

lpcs www.zdwork.cn

Pointer to a CREATESTRUCT structure that contains initialization parameters for the window about to be created. 一個指向CREATESTRUCT結構的指標,該結構包含即將被建立的窗體的初始化引數。

www.zdwork.cn

hwndInsertAfterzdwork.cn

Handle to the window whose position in the Z order precedes that of the window being created.

www.zdwork.cn

窗體的控制代碼,該窗體的Z軸位置在正在被建立的窗體的Z軸位置之前。zdwork.cn

內容來自zdwork.cn

結構2:CBTACTIVATESTRUCT Structure

本文來自智動軟體zdwork.cn

The CBTACTIVATESTRUCT structure contains information passed to a WH_CBT hook procedure, CBTProc, before a window is activated.

內容來自zdwork.cn

CBTACTIVATESTRUCT 結構包含在窗體被啟用之前,傳遞給WH_CBT鉤子子程CBTProc 的資訊。 zdwork.cn

Syntax copyright 智動軟體

typedef struct {
copyright 智動軟體

BOOLfMouse; zdwork.cn
HWNDhWndActive;本文來自智動軟體zdwork.cn
} CBTACTIVATESTRUCT, *LPCBTACTIVATESTRUCT;copyright 智動軟體

Members 成員 內容來自zdwork.cn

fMouse

內容來自zdwork.cn

Specifies whether the window is being activated as a result of a mouse click. This value is TRUE if a mouse click is causing the activation or FALSE if it is not. 指定窗體是否是由於滑鼠的點選而導致被啟用。如果是因為滑鼠的點選而引發了窗體的啟用,返回true,否則返回false。

智動軟體

hWndActive

內容來自zdwork.cn

Handle to the active window. 活動視窗的控制代碼。copyright 智動軟體

本文來自智動軟體zdwork.cn

www.zdwork.cn

結構3:CWPRETSTRUCT Structure

www.zdwork.cn

The CWPRETSTRUCT structure defines the message parameters passed to a WH_CALLWNDPROCRET hook procedure, CallWndRetProc.

www.zdwork.cn

CWPRETSTRUCT結構定義了傳遞給WH_CALLWNDPROCRET鉤子子程CallWndRetProc的訊息引數。 內容來自zdwork.cn

Syntax語法 內容來自zdwork.cn

typedef struct {zdwork.cn
LRESULTlResult;
www.zdwork.cn

LPARAMlParam;內容來自zdwork.cn
WPARAMwParam;智動軟體
UINTmessage;
內容來自zdwork.cn

HWNDhwnd; 內容來自zdwork.cn
} CWPRETSTRUCT, *PCWPRETSTRUCT; 智動軟體

Members成員

www.zdwork.cn

lResult

www.zdwork.cn

Specifies the return value of the window procedure that processed the message specified by the message value. 指定了窗體程式的返回值,該窗體程式處理由 message 值指定的訊息。智動軟體

lParam / wParam

智動軟體

Specifies additional information about the message. The exact meaning depends on the message value. 指定訊息的附加資訊。附加的意義取決於message的值。智動軟體

message

本文來自智動軟體zdwork.cn

Specifies the message. 指定訊息。 copyright 智動軟體

hwnd

智動軟體

Handle to the window that processed the message specified by the message value. 處理由message的值指定的訊息的窗體的窗體控制代碼

鉤子(HOOK)函式教程(二十八)

(2011-02-12 13:41:45) 轉載
標籤:

雜談

分類:Hook函式教程

結構4:CWPSTRUCT Structure 本文來自智動軟體zdwork.cn

The CWPSTRUCT structure defines the message parameters passed to a WH_CALLWNDPROC hook procedure, CallWndProc.

智動軟體

CWPSTRUCT 結構定義了傳遞給WH_CALLWNDPROC鉤子子程CallWndProc的訊息引數。 本文來自智動軟體zdwork.cn

Syntax zdwork.cn

typedef struct { 內容來自zdwork.cn
LPARAMlParam; www.zdwork.cn
WPARAMwParam;
zdwork.cn

UINTmessage; copyright 智動軟體
HWNDhwnd;
智動軟體

} CWPSTRUCT, *PCWPSTRUCT; zdwork.cn

Members 本文來自智動軟體zdwork.cn

lParam / wParam

內容來自zdwork.cn

Specifies additional information about the message. The exact meaning depends on the message value. 指定訊息的附加資訊。附加的意義取決於message的值。

本文來自智動軟體zdwork.cn

message

zdwork.cn

Specifies the message. 指定訊息www.zdwork.cn

hwnd zdwork.cn

Handle to the window to receive the message. 接收訊息的窗體的控制代碼。zdwork.cn

結構5:DEBUGHOOKINFO Structure

The DEBUGHOOKINFO structure contains debugging information passed to a WH_DEBUG hook procedure, DebugProc.

DEBUGHOOKINFO結構包含有傳遞給WH_DEBUG鉤子子程DebugProc的除錯資訊。

內容來自zdwork.cn

Syntax

智動軟體

typedef struct {www.zdwork.cn
DWORDidThread; zdwork.cn
DWORDidThreadInstaller; zdwork.cn
LPARAMlParam; 內容來自zdwork.cn
WPARAMwParam;zdwork.cn
intcode;zdwork.cn
} DEBUGHOOKINFO, *PDEBUGHOOKINFO;智動軟體

Members成員

內容來自zdwork.cn

idThread

內容來自zdwork.cn

Handle to the thread containing the filter function. 包含過濾方法的執行緒的控制代碼。copyright 智動軟體

idThreadInstaller 智動軟體

Handle to the thread that installed the debugging filter function. 安裝除錯過濾方法的執行緒的控制代碼。

copyright 智動軟體

lParam / wParam

copyright 智動軟體

Specifies the value to be passed to the hook in thelParamparameter of the DebugProc callback function. 指定在DebugProc回撥函式的lParam/ wParam 引數中,要傳遞給鉤子的值。 本文來自智動軟體zdwork.cn

code

www.zdwork.cn

Specifies the value to be passed to the hook in thenCodeparameter of the DebugProc callback function. 指定在DebugProc回撥函式的nCode引數中,要傳遞給鉤子的值。

www.zdwork.cn

www.zdwork.cn

結構6:EVENTMSG Structure

內容來自zdwork.cn

The EVENTMSG structure contains information about a hardware message sent to the system message queue. This structure is used to store message information for the JournalPlaybackProc callback function.copyright 智動軟體

該結構包含有關於硬體的訊息,該訊息被髮送給系統的訊息佇列。該結構用來為JournalPlaybackProc回撥函式儲存訊息的資訊。 本文來自智動軟體zdwork.cn

Syntax語法 內容來自zdwork.cn

typedef struct { zdwork.cn
UINTmessage; 智動軟體
UINTparamL;zdwork.cn
UINTparamH; 智動軟體
DWORDtime; copyright 智動軟體
HWNDhwnd;智動軟體
} EVENTMSG, *PEVENTMSG;zdwork.cn

Members成員 zdwork.cn

messagezdwork.cn

Specifies the message. 指定訊息。

zdwork.cn

paramH / paramH

本文來自智動軟體zdwork.cn

Specifies additional information about the message. The exact meaning depends on the message value. 指定訊息的附加資訊。附加的意義取決於message的值。 本文來自智動軟體zdwork.cn

time

copyright 智動軟體

Specifies the time at which the message was posted. 訊息被傳遞時的時間 。

zdwork.cn

hwnd

智動軟體

Handle to the window to which the message was posted. 訊息被傳給的視窗的控制代碼。

鉤子(HOOK)函式教程(二十九)

(2011-02-12 13:13:46) 轉載
標籤:

雜談

分類:Hook函式教程

結構7:KBDLLHOOKSTRUCT Structure智動軟體

The KBDLLHOOKSTRUCT structure contains information about a low-level keyboard input event. 本文來自智動軟體zdwork.cn

該結構包含有低層鍵盤輸入事件的資訊。

copyright 智動軟體

Syntax語法

本文來自智動軟體zdwork.cn

typedef struct {
智動軟體

DWORDvkCode;
智動軟體

DWORDscanCode;
內容來自zdwork.cn

DWORDflags;
內容來自zdwork.cn

DWORDtime; www.zdwork.cn
ULONG_PTRdwExtraInfo; copyright 智動軟體
} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
copyright 智動軟體

Members成員內容來自zdwork.cn

vkCode內容來自zdwork.cn

Specifies a virtual-key code. The code must be a value in the range 1 to 254. 指定虛擬鍵值。該值必須在1到254的範圍內。

zdwork.cn

scanCode

本文來自智動軟體zdwork.cn

Specifies a hardware scan code for the key.指定鍵的硬體掃描碼。

www.zdwork.cn

flagszdwork.cn

Specifies the extended-key flag, event-injected flag, context code, and transition-state flag. This member is specified as follows. An application can use the following values to test the keystroke flags.內容來自zdwork.cn

指定擴充套件鍵標誌,事件注入標誌,上下文程式碼,轉換狀態碼。成員如下所示。應用程式可以使用下列值來檢查鍵盤敲擊標誌。zdwork.cn

Value值

copyright 智動軟體

Purpose目的www.zdwork.cn

LLKHF_EXTENDED zdwork.cn

Test the extended-key flag. 測試擴充套件鍵標誌。copyright 智動軟體

LLKHF_INJECTED copyright 智動軟體

Test the event-injected flag. 測試事件注入標誌。

內容來自zdwork.cn

LLKHF_ALTDOWN

copyright 智動軟體

Test the context code. 測試上下文程式碼。

www.zdwork.cn

LLKHF_UP 智動軟體

Test the transition-state flag. 測試轉換狀態碼。zdwork.cn

內容來自zdwork.cn

0 :Specifies whether the key is an extended key, such as a function key or a key on the numeric keypad. The value is 1 if the key is an extended key; otherwise, it is 0. 指定該鍵是否是擴充套件鍵,例如:功能鍵、數字鍵盤上的鍵。是擴充套件鍵為1,否則為0。 copyright 智動軟體

1-3 :Reserved. 保留。

內容來自zdwork.cn

4 :Specifies whether the event was injected. The value is 1 if the event was injected; otherwise, it is 0. 指定事件是否被注入。被注入為1,否則為0。

本文來自智動軟體zdwork.cn

5 :Specifies the context code. The value is 1 if the ALT key is pressed; otherwise, it is 0. 指定上下文程式碼。如果按下了ALT,該值為1,否則為0

智動軟體

6 :Reserved. 保留。智動軟體

7 :Specifies the transition state. The value is 0 if the key is pressed and 1 if it is being released.指定轉換狀態。如果該鍵被按下該值為1,如果被釋放為0。www.zdwork.cn

time 內容來自zdwork.cn

Specifies the time stamp for this message, equivalent to what GetMessageTime would return for this message. 指定訊息的時間戳,相當於GetMessageTime返回的值。智動軟體

dwExtraInfo 內容來自zdwork.cn

Specifies extra information associated with the message. 指定和該訊息相關聯的擴充套件資訊

鉤子(HOOK)函式教程(三十)

(2011-02-12 13:13:18) 轉載
標籤:

雜談

分類:Hook函式教程

結構8:MOUSEHOOKSTRUCT Structurecopyright 智動軟體

TheMOUSEHOOKSTRUCTstructure contains information about a mouse event passed to a WH_MOUSE hook procedure, MouseProc.

zdwork.cn

MOUSEHOOKSTRUCT結構包含有傳遞給WH_MOUSE鉤子子程MouseProc的,關於滑鼠事件的資訊。本文來自智動軟體zdwork.cn

Syntax語法

本文來自智動軟體zdwork.cn

typedef struct {內容來自zdwork.cn

POINTpt;

www.zdwork.cn

HWNDhwnd;

www.zdwork.cn

UINTwHitTestCode;本文來自智動軟體zdwork.cn

ULONG_PTRdwExtraInfo;本文來自智動軟體zdwork.cn

} MOUSEHOOKSTRUCT, *PMOUSEHOOKSTRUCT;

www.zdwork.cn

Members成員

copyright 智動軟體

pt:Specifies a POINT structure that contains the x- and y-coordinates of the cursor, in screen coordinates.指定在螢幕座標系下,包含有游標x、y座標的POINT結構。copyright 智動軟體

hwnd: Handle to the window that will receive the mouse message corresponding to the mouse event.希望對滑鼠事件做出響應、接收滑鼠訊息的窗體的控制代碼。

本文來自智動軟體zdwork.cn

wHitTestCode:Specifies the hit-test value. For a list of hit-test values, see the description of the WM_NCHITTEST message.指定點選測試值。檢視WM_NCHITTEST訊息可以得到值的列表。zdwork.cn

dwExtraInfo:Specifies extra information associated with the message.指定和該訊息相關聯的附加資訊。

內容來自zdwork.cn

智動軟體

結構9:MOUSEHOOKSTRUCTEX Structure內容來自zdwork.cn

TheMOUSEHOOKSTRUCTEXstructure contains information about a mouse event passed to a WH_MOUSE hook procedure, MouseProc.內容來自zdwork.cn

MOUSEHOOKSTRUCTEX結構包含有傳遞給WH_MOUSE鉤子子程MouseProc的關於滑鼠事件的資訊。

智動軟體

This is an extension of the MOUSEHOOKSTRUCT structure that includes information about wheel movement or the use of the X button.copyright 智動軟體

這是對MOUSEHOOKSTRUCT的擴充套件。包含有滾輪的活動和X鍵的使用。

內容來自zdwork.cn

Syntax語法

本文來自智動軟體zdwork.cn

typedef struct {copyright 智動軟體

MOUSEHOOKSTRUCTMOUSEHOOKSTRUCT;智動軟體

DWORDmouseData;智動軟體

} MOUSEHOOKSTRUCTEX, *PMOUSEHOOKSTRUCTEX;內容來自zdwork.cn

Members成員copyright 智動軟體

MOUSEHOOKSTRUCT內容來自zdwork.cn

The members of aMOUSEHOOKSTRUCTstructure make up the first part of this structure.

zdwork.cn

MOUSEHOOKSTRUCT結構的成員構成了該結構的前面部分。

zdwork.cn

mouseData

本文來自智動軟體zdwork.cn

If the message is WM_MOUSEWHEEL, the HIWORD of this member is the wheel delta. The LOWORD is undefined and reserved. A positive value indicates that the wheel was rotated forward, away from the user; a negative value indicates that the wheel was rotated backward, toward the user. One wheel click is defined as WHEEL_DELTA, which is 120.

內容來自zdwork.cn

如果訊息是WM_MOUSEWHEEL,該成員的HIWORD就是wheel delta。LOWORD做為保留未定義。正值表示滾輪向前旋轉,即遠離使用者的方向;負值表示滾輪向後旋轉,即朝向使用者的方向。滾輪的點選被定義為WHEEL_DELTA,具體值為120。www.zdwork.cn

If the message is WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLK, WM_NCXBUTTONDOWN, WM_NCXBUTTONUP, or WM_NCXBUTTONDBLCLK, the HIWORD ofmouseDataspecifies which X button was pressed or released, and the LOWORD is undefined and reserved. This member can be one or more of the following values. Otherwise,mouseDatais not used.本文來自智動軟體zdwork.cn

如果訊息是WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLK, WM_NCXBUTTONDOWN, WM_NCXBUTTONUP,或者WM_NCXBUTTONDBLCLK,mouseData的HIWORD值指定哪個X鍵被按下或者釋放,LOWORD做為保留未定義。該成員可以是以下值中的一個或者多個。否則,mouseData未使用。本文來自智動軟體zdwork.cn

1.XBUTTON1:The first X button was pressed or released.第一個X鍵被按下或者釋放。內容來自zdwork.cn

2.XBUTTON2:The second X button was pressed or released.第二個X鍵被按下或者釋放。

鉤子(HOOK)函式教程(三十一)

(2011-02-12 12:55:10) 轉載
標籤:

雜談

分類:Hook函式教程

結構9:MSLLHOOKSTRUCT Structure 本文來自智動軟體zdwork.cn

The MSLLHOOKSTRUCT structure contains information about a low-level keyboard input event. (msdn錯誤) copyright 智動軟體

該MSLLHOOKSTRUCT結構包含有低層鍵盤輸入事件的資訊。

zdwork.cn

Syntax語法 www.zdwork.cn

typedef struct { 智動軟體
POINTpt;www.zdwork.cn
DWORDmouseData; 本文來自智動軟體zdwork.cn
DWORDflags;copyright 智動軟體
DWORDtime; zdwork.cn
ULONG_PTRdwExtraInfo;
zdwork.cn

} MSLLHOOKSTRUCT, *PMSLLHOOKSTRUCT;本文來自智動軟體zdwork.cn

Members成員 copyright 智動軟體

pt :Specifies a POINT structure that contains the x- and y-coordinates of the cursor, in screen coordinates. 指定在螢幕座標系下,包含有游標x、y座標的POINT結構。

www.zdwork.cn

mouseData

zdwork.cn

If the message is WM_MOUSEWHEEL, the HIWORD of this member is the wheel delta. The LOWORD is undefined and reserved. A positive value indicates that the wheel was rotated forward, away from the user; a negative value indicates that the wheel was rotated backward, toward the user. One wheel click is defined as WHEEL_DELTA, which is 120.

www.zdwork.cn

如果訊息是WM_MOUSEWHEEL,該成員的HIWORD就是wheel delta。LOWORD做為保留未定義。正值表示滾輪向前旋轉,即遠離使用者的方向;負值表示滾輪向後旋轉,即朝向使用者的方向。滾輪的點選被定義為WHEEL_DELTA, 具體值為120。

智動軟體

If the message is WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLK, WM_NCXBUTTONDOWN, WM_NCXBUTTONUP, or WM_NCXBUTTONDBLCLK, the HIWORD of mouseData specifies which X button was pressed or released, and the LOWORD is undefined and reserved. This member can be one or more of the following values. Otherwise, mouseData is not used.www.zdwork.cn

如果訊息是WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLK, WM_NCXBUTTONDOWN, WM_NCXBUTTONUP, 或者 WM_NCXBUTTONDBLCLK,mouseData 的HIWORD值指定哪個X鍵被按下或者釋放,LOWORD做為保留未定義。該成員可以是以下值中的一個或者多個。否則,mouseData未使用。www.zdwork.cn

1.XBUTTON1:The first X button was pressed or released. 第一個X鍵被按下或者釋放。本文來自智動軟體zdwork.cn

2.XBUTTON2 :The second X button was pressed or released.第二個X鍵被按下或者釋放。

copyright 智動軟體

flags copyright 智動軟體

Specifies the event-injected flag. An application can use the following value to test the mouse flags. 指定事件注入標誌。應用程式可以使用下列值來測試滑鼠標誌。 本文來自智動軟體zdwork.cn

Value

智動軟體

Purpose

www.zdwork.cn

LLMHF_INJECTED

內容來自zdwork.cn

Test the event-injected flag.測試事件注入標誌。

copyright 智動軟體

copyright 智動軟體

0

本文來自智動軟體zdwork.cn

Specifies whether the event was injected. The value is 1 if the event was injected; otherwise, it is 0. 事件是否被注入。如果被注入,為 1,否則為0www.zdwork.cn

1-15 :Reserved.保留

zdwork.cn

time

www.zdwork.cn

Specifies the time stamp for this message. 訊息的時間戳。

www.zdwork.cn

dwExtraInfo zdwork.cn

Specifies extra information associated with the message. 訊息的擴充套件資訊