使用鉤子函數[4]

來源:互聯網
上載者:User

SetWindowsHookEx 函數的第一個參數表示鉤子類型, 共有 14 種選擇, 前面我們已經用過兩種:

WH_KEYBOARD、WH_MOUSE.

系統會為每一種類型的鉤子建立一個表(那就是 14 個表), 譬如某個應用程式啟動了鍵盤鉤子, 我們自己的程式也啟動了鍵盤鉤子, 同樣是鍵盤鉤子就會進入同一個表. 這個表(可能不止一個, 可能還會有滑鼠鉤子等等)就是傳說中的"鉤子鏈".

假如某個鉤子鏈中共進來了三個鉤子(譬如是: 鉤子A、鉤子B、鉤子C 依次進來), 最後進來的 "鉤子C" 會先執行.

是不是先進後出? 我覺得應該說成: 後進先出! 這有區別嗎? 有! 因為先進來的不一定出得來.

最後進了的鉤子會最先得到執行, 先前進來的鉤子(鉤子A、鉤子B)能不能得到執行那還得兩說, 這得有正在執行的 "鉤子C" 說了算.

如果 "鉤子C" 的函數中包含了 CallNextHookEx 語句, 那麼 "鉤子A、鉤子B" 就有可能得以天日; 不然就只有等著相應的

UnhookWindowsHookEx 來把它們帶走(我想起趙本山的小品...).

這時你也許會想到: 這樣太好了, 我以後就不加 CallNextHookEx , 只讓自己的鉤子"橫行"; 但如果是你的鉤子先進去的呢?

所以 Windows 建議: 鉤子函數要調用 CallNextHookEx, 並把它的傳回值當作鉤子函數自己的傳回值.

CallNextHookEx 同時要給鉤子鏈中的下一個(或許應該叫上一個)鉤子傳遞參數(譬如在鍵盤訊息中按了哪個鍵). 一個鍵盤鉤子和滑鼠鉤子的參數一樣嗎? 當然不一樣, 所以它們也不在一個 "鏈" 中啊; 同一個鏈中的鉤子的類型肯定是一樣的.

再聊聊鉤子函數的傳回值:

在這之前, 鉤子函數的傳回值, 我們都是遵循 Windows 的慣例, 返回了 CallNextHookEx 的傳回值.

如果 CallNextHookEx 成功, 它會返回下一個鉤子的傳回值, 是個連環套;

如果 CallNextHookEx 失敗, 會返回 0, 這樣鉤子鏈也就斷了, 只有當前鉤子還在執行任務.

不同類型的鉤子函數的傳回值是不同的, 對鍵盤鉤子來講如果返回一個非 0 的值, 表示它處理完以後就把訊息給消滅了.

換句話說:

如果給鍵盤的鉤子函數 Result := 0; 說明訊息被鉤子攔截並處理後就給 "放" 了;

如果給鍵盤的鉤子函數 Result := 1; 說明訊息被鉤子攔截並處理後又給 "殺" 了.

在下面的例子中, 我們乾脆不使用 CallNextHookEx (反正暫時就我一個鉤子), 直接給傳回值!

這是接下來例子的示範動畫:

動畫中, 我在三種狀態下分別給 Memo 輸入了字母 a

當沒啟動鉤子時, Memo 是可以正常輸入的;

當鉤子函數返回 0, 鉤上以後, 先執行了鉤子函數的功能(返回索引值), 字母 a 也能輸入成功;

當鉤子函數返回非 0 值(譬如1), 鉤上以後, 就只執行了鉤子函數的功能(返回索引值), 可憐的 Memo 不知道發生了什麼.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.