HHOOK SetWindowsHookEx(--->新建一個HOOK過程添加到HOOK鏈中,最後添加進去的,在HOOK鏈最前
int idHook, // hook type---》鉤子類型
HOOKPROC lpfn, // hook procedure--》鉤子過程指針
HINSTANCE hMod, // handle to application instance ---》如果是當前進程的HOOK過程,則設置爲NULL
DWORD dwThreadId // thread identifier---》如果這個爲0或者爲不同的進程構建的HOOK過程指針,則lpfn爲動態鏈接庫中的HOOK過程
);
DWORD GetCurrentThreadId(VOID);--》獲得當前線程的ID
VK_0-VK_9 鍵盤上的0到9
VK_A-VK_Z 鍵盤上的A-Z
BOOL UnhookWindowsHookEx(
HHOOK hhk // handle to hook procedure
);---》從hook鏈中刪除某個HOOK過程
如何建立鍵盤HOOK和鼠標hook?
低下只顯示需要添加的代碼,其他的就不顯示了
HHOOK g_hMouse = NULL;
HHOOK g_hKeyboard=NULL;---》定義全局變量
HWND g_hWnd=NULL;
LRESULT CALLBACK MouseProc(
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
)
{
return 1;----》屏蔽所有鼠標點擊事件
}
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
// if(VK_SPACE==wParam VK_RETURN==wParam)
/* if(VK_F4==wParam && (1==(lParam>>29 & 1)))----》如何屏蔽組合鍵ALT+F4
return 1;
else
return CallNextHookEx(g_hKeyboard,code,wParam,lParam);*/
if(VK_F2==wParam)
{
::SendMessage(g_hWnd,WM_CLOSE,0,0);
UnhookWindowsHookEx(g_hKeyboard);
UnhookWindowsHookEx(g_hMouse);
}
return 1;
}
BOOL CInnerHookDlg::OnInitDialog()
{
g_hWnd = m_hWnd;---》獲取當前句柄
g_hMouse = SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());
g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());
return TRUE;
}
如何使用動態鏈接庫來產生一個hook應用?
BOOL SetWindowPos (
const CWnd* pWndInsertAfter,
int x,
int y,
int cx,
int cy,
UINT nFlags );
這裏使用自定義模塊來實現一個動態鏈接庫,
#include <windows.h>
HHOOK g_hMouse=NULL;
HHOOK g_hKeyboard=NULL;
HWND g_hWnd=NULL;
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
if(VK_F2==wParam)
{
SendMessage(g_hWnd,WM_CLOSE,0,0);
UnhookWindowsHookEx(g_hMouse);
UnhookWindowsHookEx(g_hKeyboard);
}
return 1;
}
LRESULT CALLBACK MouseProc(
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
)
{
return 1;
}
void SetHook(HWND hwnd)
{
g_hWnd=hwnd;
g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0);
g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0);
}
在DEF文件中寫入:
LIBRARY Hook
EXPORTS
SetHook @2---》@2爲序列號,由此設置
而在別處調用的時候是:
_declspec(dllimport) void SetHook(HWND hwnd);
BOOL CHookTestDlg::OnInitDialog()
{
int cxScreen,cyScreen;
cxScreen=GetSystemMetrics(SM_CXSCREEN);
cyScreen=GetSystemMetrics(SM_CYSCREEN);
SetWindowPos(&wndTopMost,0,0,cxScreen,cyScreen,SWP_SHOWWINDOW);
SetHook(m_hWnd);
return TRUE;
}
以上的代碼將當前彈出的窗口失去焦點,點擊F2,則無法退出頁面,那麼
如何讓多個進程共享這個代碼呢?
在命令提示符中 dumbin -headers Hook.dll 查看dll生成的節信息
將上面代碼更改爲:
#include <windows.h>
HHOOK g_hMouse=NULL;
HHOOK g_hKeyboard=NULL;
#pragma data_seg("MySec")
HWND g_hWnd=NULL;----》注意此處要賦值爲NULL,否則在節信息裏看不到節信息
#pragma data_seg()
#pragma comment(linker,"/section:MySec,RWS")--》RWS爲read write share 的縮寫 創建共享
創建共享節還可以再DEF文件裏寫入
LIBRARY Hook
EXPORTS
SetHook @2
SEGMENTS
MySec READ WRITE SHARED
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to the DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved // reserved
)
{
g_hInst=hinstDLL;
}
*/
HC_ACTION
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
if(VK_F2==wParam)
{
SendMessage(g_hWnd,WM_CLOSE,0,0);
UnhookWindowsHookEx(g_hMouse);
UnhookWindowsHookEx(g_hKeyboard);
}
return 1;
}
LRESULT CALLBACK MouseProc(
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
)
{
return 1;
}
void SetHook(HWND hwnd)
{
g_hWnd=hwnd;
g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0);
g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0);
}
這樣即使生成的窗口失去焦點,則按F2鍵,則依然會將生成的窗口退出,這樣就建立了多個進程共享此代碼事件
如何獲取動態鏈接庫的句柄?
1.BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to the DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved // reserved
);中包含了實例句柄,則定義一個全局變量,
HINSTANCE g_hInst;
應用如下:
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to the DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved // reserved
)
{
g_hInst=hinstDLL;
}
2.
HMODULE GetModuleHandle(
LPCTSTR lpModuleName // module name
);
應用如下:
GetModuleHandle("HOOK");
鉤子的應用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.