日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

读书 - Delphi下深入Windows核心编程 第二天

發布時間:2025/5/22 windows 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 读书 - Delphi下深入Windows核心编程 第二天 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

技術交流,DH講解.

今天進入這書第二章 鉤子(HOOK).
先說說鉤子是什么?
鉤子其實就在你環境中加上一層過濾,在特殊情況下就觸發鉤子回調函數.
比如說我們安裝了全局的鍵盤鉤子,那么當我們按動鍵盤上面的鍵的時候,鉤子的回調函數就會觸發.
我們也能看到本來是直來直往的,結果現在中間安裝了一層過濾,系統的效率肯定會有所下降的.
要了解,我們只需要知道3個函數:
1 上鉤函數:

function SetWindowsHookEx(idHook: Integer;//鉤子的類型 lpfn: TFNHookProc; //回調函數指針hmod: HINST; //一般為0或者InstancedwThreadId: DWORD//全局鉤子就為0,不然就為指定進程id): HHOOK; stdcall;//成功就返回一個值,不成功就為0

其中鉤子類型有:

{$EXTERNALSYM WH_MIN}WH_MIN = -1;{$EXTERNALSYM WH_MSGFILTER}WH_MSGFILTER = -1;{$EXTERNALSYM WH_JOURNALRECORD}WH_JOURNALRECORD = 0;{$EXTERNALSYM WH_JOURNALPLAYBACK}WH_JOURNALPLAYBACK = 1;{$EXTERNALSYM WH_KEYBOARD}WH_KEYBOARD = 2;{$EXTERNALSYM WH_GETMESSAGE}WH_GETMESSAGE = 3;{$EXTERNALSYM WH_CALLWNDPROC}WH_CALLWNDPROC = 4;{$EXTERNALSYM WH_CBT}WH_CBT = 5;{$EXTERNALSYM WH_SYSMSGFILTER}WH_SYSMSGFILTER = 6;{$EXTERNALSYM WH_MOUSE}WH_MOUSE = 7;{$EXTERNALSYM WH_HARDWARE}WH_HARDWARE = 8;{$EXTERNALSYM WH_DEBUG}WH_DEBUG = 9;{$EXTERNALSYM WH_SHELL}WH_SHELL = 10;{$EXTERNALSYM WH_FOREGROUNDIDLE}WH_FOREGROUNDIDLE = 11;{$EXTERNALSYM WH_CALLWNDPROCRET}WH_CALLWNDPROCRET = 12;{$EXTERNALSYM WH_KEYBOARD_LL}WH_KEYBOARD_LL = 13;{$EXTERNALSYM WH_MOUSE_LL}WH_MOUSE_LL = 14;{$EXTERNALSYM WH_MAX}WH_MAX = 14;{$EXTERNALSYM WH_MINHOOK}WH_MINHOOK = WH_MIN;{$EXTERNALSYM WH_MAXHOOK}WH_MAXHOOK = WH_MAX;

具體作用基本上就看名字就知道,個別的我也不知道,具體的大家看MSDN吧.這個是個葵花寶典.
2 卸鉤函數:

function UnhookWindowsHookEx(hhk: HHOOK//上鉤函數返回的句柄): BOOL; stdcall;

3 具體的鉤子回調函數:

TFNHookProc = function (code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;

好的說了這么多,看例子:

VarH: HHOOK;Function MyKeyBoardHookProc(Code: Integer; Wparam: WPARAM;Lparam: LPARAM): LRESULT Stdcall; BeginIf Code = HC_ACTION ThenBegin// wparam是virtal code// lparam要分字節ShowMessage(Format('點擊%D鍵%D次', [Wparam, Lparam And $0000FFFF]));End;// 一定要記得調用下一個鉤子,因為我們要知道可能這個東西不只是你要處理,別人也要處理,// 如果你處理,就不往下傳了,我也米有辦法...算你BTResult := CallNextHookEx(H, Code, Wparam, Lparam); End;Procedure TForm2.Button1Click(Sender: TObject); BeginH := SetWindowsHookEx(WH_KEYBOARD, MyKeyBoardHookProc, 0, GetCurrentThreadId); End;Procedure TForm2.Button2Click(Sender: TObject); BeginUnhookWindowsHookEx(H) End;



這個鉤子的例子,只對自己進程有效,如果我們想全局都有效,就是對別人的進程也有效,那么我們需要將鉤子代碼寫到Dll里面去.

接下來就演示全局鉤子吧.

VarH: HHOOK;ExeHandle: Cardinal; // 這個handle一定能要用內存映射出來,因為全局鍵盤鉤子話,// 只要程序一按鍵,dll就會加載到這個進程里面了,所以就形成多進程情況,這里我就不弄了Function MyKeyBoardProc(Code: Integer; Wparam: WPARAM;Lparam: LPARAM): LRESULT Stdcall; BeginIf Code = HC_ACTION ThenPostMessage(ExeHandle, WM_HOTKEY, Wparam, Lparam); // 這里偷懶了,直接轉發出去Result := CallNextHookEx(H, Code, Wparam, Lparam) End;Function HookOn(AHandle: Cardinal): Boolean; Export; // 導出它 BeginExeHandle := AHandle;H := SetWindowsHookEx(WH_KEYBOARD, MyKeyBoardProc, HInstance, 0);// 最后一個參數一定是0Result := H <> 0; // 判斷是否成功 End;Function HookOff(): Boolean;export; BeginResult := UnhookWindowsHookEx(H) End;

其他的api hook以后再講,這里就大致講了下鉤子如何使用.希望能有點兒幫助.

轉載于:https://www.cnblogs.com/huangjacky/archive/2010/01/21/1653717.html

總結

以上是生活随笔為你收集整理的读书 - Delphi下深入Windows核心编程 第二天的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。