读书 - Delphi下深入Windows核心编程 第二天
生活随笔
收集整理的這篇文章主要介紹了
读书 - Delphi下深入Windows核心编程 第二天
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
技術交流,DH講解.
今天進入這書第二章 鉤子(HOOK).
先說說鉤子是什么?
鉤子其實就在你環境中加上一層過濾,在特殊情況下就觸發鉤子回調函數.
比如說我們安裝了全局的鍵盤鉤子,那么當我們按動鍵盤上面的鍵的時候,鉤子的回調函數就會觸發.
我們也能看到本來是直來直往的,結果現在中間安裝了一層過濾,系統的效率肯定會有所下降的.
要了解,我們只需要知道3個函數:
1 上鉤函數:
其中鉤子類型有:
{$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 卸鉤函數:
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核心编程 第二天的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1个多月就能看到效果的减肥大法 - 生活
- 下一篇: 前台获取后台数据写法%#%..