电竞比分网-中国电竞赛事及体育赛事平台

分享

使用鉤子函數(shù)[2]

 aaie_ 2011-10-11
 鉤子函數(shù)雖然不多, 但其參數(shù)復雜, 應該從參數(shù)入手才能深入進去.

  UnhookWindowsHookEx 只需要 SetWindowsHookEx 返回的鉤子句柄作參數(shù), 這個簡單;

  先看看 SetWindowsHookEx 的聲明:

SetWindowsHookEx(
 idHook: Integer;  {鉤子類型}
 lpfn: TFNHookProc; {函數(shù)指針}
 hmod: HINST;    {包含鉤子函數(shù)的模塊(EXE、DLL)的句柄}
 dwThreadId: DWORD {關聯(lián)的線程}
): HHOOK;

  第一個參數(shù)非常麻煩, 從后面說:

  參數(shù)四 dwThreadId : 在設置全局鉤子時這個參數(shù)一般是 0, 表示關聯(lián)所有線程; 本例是線程級的鉤子, 所以是

  GetCurrentThreadId.

  參數(shù)三 hmod: 是模塊實例的句柄, 在 EXE 和 DLL 中都可以用 HInstance 得到當前實例的句柄; 直接用 API 也可以:

  GetModuleHandle(nil).

  參數(shù)二 lpfn: 是鉤子函數(shù)的指針, 用 @ 和 Addr 函數(shù)都可以得到函數(shù)指針; 這里的關鍵是那個鉤子函數(shù):

  首先不同的鉤子類型對應著不同的鉤子函數(shù)結構, Win32 共有 14 種鉤子類型, 這是 詳細注釋;

  本例用的是鍵盤鉤子, 鍵盤鉤子的回調(diào)函數(shù)的參數(shù)結構在 這里, 我們定義的函數(shù)名無所謂, 參數(shù)必須按照Windows的規(guī)定來.

  還有, 這個回調(diào)函數(shù)的調(diào)用慣例必須是: stdcall; 我們在上例中是先在接口區(qū)聲明, 如果不要聲明直接實現(xiàn), 也不能忘了這個 stdcall.

  根據(jù)以上說明, 做如下修改:

  SetWindowsHookEx 的參數(shù)有變通;

  并且取消了鉤子函數(shù)在接口區(qū)的聲明, 是直接實現(xiàn)的;

  取消了攔截條件, 現(xiàn)在只要是鍵盤消息全都攔截.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm1 = class(TForm)
  procedure FormCreate(Sender: TObject);
  procedure FormDestroy(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

var
 hook: HHOOK; {定義一個鉤子句柄}

{現(xiàn)在這個鉤子函數(shù)沒有在接口區(qū)聲明, 這里必須指定參數(shù)調(diào)用方式: stdcall}
function KeyHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
 Beep;
 Result := CallNextHookEx(hook, nCode, wParam, lParam);
end;

{設置鍵盤鉤子}
procedure TForm1.FormCreate(Sender: TObject);
begin
 hook := SetWindowsHookEx(WH_KEYBOARD, Addr(KeyHook), HInstance, GetCurrentThreadId);
end;

{釋放鍵盤鉤子}
procedure TForm1.FormDestroy(Sender: TObject);
begin
 UnhookWindowsHookEx(hook);
end;

end.

  鉤子函數(shù)為什么非得使用 stdcall 調(diào)用機制? 因為鉤子函數(shù)不是被應用程序調(diào)用, 而是被系統(tǒng)調(diào)用的

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多