1. 程式人生 > >全域性鉤子為什麼要用DLL 共享節

全域性鉤子為什麼要用DLL 共享節

利用全域性鉤子  在別的程序視窗下 關閉test視窗

關於全域性鉤子為什麼一定要在DLL中

2013-12-05 13:02使徒闢允382  分類:網站使用 | 瀏覽 66 次 我有更好的答案 舉報| 2013-12-05 14:03 提問者採納
如果你只hook本程序得訊息,可以把訊息回撥函式和呼叫鉤子的函式寫在一起,也就是隻需要寫個exe就可以了。
如果要hook全域性訊息,需要全域性鉤子,這樣,需要把你的HOOK程式碼注入到系統每個程序裡面去。而實現這個最好的方法,就是用dll來實現。系統會自動把該DLL注入到所有的程序空間中。所以,不一定是必須要寫DLL來HOOK

對於DLL被多個程序使用時

 多個程序會共用DLL的程式碼頁面和資料頁面

但是

如果不設定共享節 全域性變數 g_hwnd被賦值時,程序修改變數時,會額外開闢屬於程序自己的資料空間

導致這個變數並沒有被各個程序共享

在DLL CPP中

#include <Windows.h>


#pragma data_seg("MySec")	//字元最大長度8 多了會自動截掉
HWND g_hwnd = NULL;			//新節中放置變數 必須初始化
#pragma data_seg()

#pragma comment(linker,"/section:MySec,RWS")
	//指令型別為linker 表明該行程式碼用來指定連結選項
	//將MySec 這個節 設定為 讀 寫 共享 型別  read write shared

HHOOK g_hMouse=NULL;
HHOOK g_hKeyboard=NULL;

//滑鼠鉤子過程
LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
	return 0;<span style="white-space:pre">	</span>
}

LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
	if(VK_F2 == wParam)	//F2關閉
	{
		::SendMessageA(g_hwnd,WM_CLOSE,0,0);
		::UnhookWindowsHookEx(::g_hKeyboard);
		::UnhookWindowsHookEx(::g_hMouse);
	}
	return 0;
}

//安裝滑鼠鉤子過程的函式
void SetHook( HWND hwnd )
{
	::g_hwnd=hwnd;						//這條賦值語句其實也可以寫在應用程式的函式外
	::g_hMouse=::SetWindowsHookExA(
		WH_MOUSE,
		::MouseProc,
		::GetModuleHandleA("0712B.dll"),		//安裝鉤子的DLL的模組控制代碼
		0						//第四個引數設為0 全域性鉤子 所有程序
		);
	;

	::g_hKeyboard=::SetWindowsHookExA(
		WH_KEYBOARD,
		::KeyboardProc,
		::GetModuleHandleA("0712B.dll"),		
		0						
		);
	;
}
程序執行後,即使在別的視窗(比如瀏覽器)下按F2,也會把exe給關了

風行者引領群雄者行風