之前作鉤子的時候沒寫記錄的習慣。昨天馬力叫我從新作一個。此次補上。
鉤子(Hook),是Windows消息處理機制的一個平臺,應用程序能夠在上面設置子程以監視指定窗口的某種消息,並且所監視的窗口能夠是其餘進程所建立的。當消息到達後,在目標窗口處理函數以前處理它。鉤子機制容許應用程序截獲處理window消息或特定事件。
至因而否須要把鉤子寫在DLL裏面取決於需求,若是隻HOOK本進程得消息,能夠把消息回調函數和調用鉤子的函數寫在一塊兒,也就是隻須要寫個EXE就能夠了。若是要HOOK全局消息,須要全局鉤子,這樣,須要把HOOK代碼注入到系統每一個進程裏面去。而實現這個最好的方法,就是用DLL來實現。系統會自動把該DLL注入到全部的進程空間中。因此,不必定是必需要寫DLL來HOOK。
相關函數:
建立新的鉤子函數加
HHOOK SetWindowsHookEx( int idHook,HOOKPROC lpfn, INSTANCE hMod,DWORD dwThreadId)
鉤子類型:好比 WH_KEYBOARD_LL,
回調函數地址:鉤子處理函數 LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
實例句柄:應用程序的實例句柄
線程ID:要爲哪一個線程安裝鉤子.若是它爲0則爲所有線程都安裝鉤子,即爲全局鉤子.這就是得到所有應用程序消息控制權的開始
卸載鉤子函數
BOOL UnhookWindowsHookEx( HHOOK hhk)
hhk爲前一個函數的返回值。
我也不知道如何描述的函數= =
LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam ) 。
此次需求僅僅是屏蔽,那就是不須要記錄信息。僅僅是勾取消息後直接丟棄。
設置鍵盤底層鉤子
HHOOK key_hHook = SetWindowsHookEx(
WH_KEYBOARD_LL,
KeyHookProc,
base,
//g_hInst,
0);
鼠標底層鉤子
HHOOK mouse_hHook = SetWindowsHookEx(
WH_MOUSE_LL,
MouseHookProc,
base,
0 );
以後關於鉤子函數,屏蔽便是PC機不做出迴應。那麼鉤出的全部消息不作任何處理,直接給予拋棄處理。即return true;
關於DLL,轉載下在論壇看的一段。由於本身也不是很懂。
Win32 DLL的入口和出口函數都是DLLMain這同Win16 DLL是有區別的。只要有進程或線程載入和卸載DLL時,都會調用該函數,其原型是:
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpvReserved);其中,第一個參數表示DLL的實例句柄;第三個參數系統保留;第二個參數指明瞭當前調用該動態鏈接庫的狀態,它有四個可能的值:DLL_PROCESS_ATTACH(進程載入)、DLL_THREAD_ATTACH(線程載入)、DLL_THREAD_DETACH(線程卸載)、DLL_PROCESS_DETACH(進程卸載)。在DLLMain函數中能夠經過對傳遞進來的這個參數的值進行判別,根據不一樣的參數值對DLL進行必要的初始化或清理工做。因爲在Win32環境下,全部進程的空間都是相互獨立的,這減小了應用程序間的相互影響,但大大增長了編程的難度。當進程在動態加載DLL時,系統自動把DLL地址映射到該進程的私有空間,並且也複製該DLL的全局數據的一份拷貝到該進程空間,每一個進程所擁有的相同的DLL的全局數據其值卻並不必定是相同的。當DLL內存被映射到進程空間中,每一個進程都有本身的全局內存拷貝,加載DLL的每個新的進程都從新初始化這一內存區域,也就是說進程不能再共享DLL。所以,在Win32環境下要想在多個進程中共享數據,就必須進行必要的設置。一種方法即是把這些須要共享的數據單獨分離出來,放置在一個獨立的數據段裏,並把該段的屬性設置爲共享,創建一個內存共享的DLL。
以後便是動態連接庫的加載。
靜態加載須要動態連接的DLL和LIB以及H頭文件。
以後添加代碼
#include<xxx.h>
#pragma comment(lib,"XXX.lib").
以後直接引用函數。
動態加載:
typedef BOOL (_stdcall * AddProc)(需導出的函數參數名)
HINSTANCE hInst;
hInst=LoadLibrary("動態連接庫名.dll");
AddProc m_Unlock=(AddProc)GetProcAddress(hInst,"函數名");//獲取Dll的導出函數
AddProc m_Lock=(AddProc)GetProcAddress(hInst,"函數名");//獲取Dll的導出函數
不過動態加載的方法在使用的時候個人程序會中止工做。具體緣由不明。靜態加載沒問題。