一個Hook鉤子示例

設置HOOK

HHOOK WINAPI SetWindowsHookEx(

__in int idHook, \\鉤子類型

__in HOOKPROC lpfn, \\回調函數地址

__in HINSTANCE hMod, \\實例句柄

__in DWORD dwThreadId); \\線程ID

 

HHOOK SetWindowsHookEx(

int idHook,       // 鉤子的類型,即它處理的消息類型

HOOKPROC lpfn,    // 鉤子子程的地址指針。如果dwThreadId參數爲0

                  // 或是一個由別的進程創建的線程的標識,

                  // lpfn必須指向DLL中的鉤子子程。

                  // 除此以外,lpfn可以指向當前進程的一段鉤子子程代碼。

                  // 鉤子函數的入口地址,當鉤子鉤到任何消息後便調用這個函數。

HINSTANCE hMod,   // 應用程序實例的句柄。標識包含lpfn所指的子程的DLL。

                  // 如果dwThreadId 標識當前進程創建的一個線程,

                  // 而且子程代碼位於當前進程,hMod必須爲NULL。

                  // 可以很簡單的設定其爲本應用程序的實例句柄。

DWORD dwThreadId // 與安裝的鉤子子程相關聯的線程的標識符。

                  // 如果爲0,鉤子子程與所有的線程關聯,即爲全局鉤子。

);

 

一個簡單的當前線程鉤子示例

 

HHOOK g_hMouseHook = nullptr;

 

g_hMouseHook = SetWindowsHookEx(WH_MOUSE, MouseProc, NULL, GetCurrentThreadId());


//鼠標鉤子處理函數
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	MOUSEHOOKSTRUCT *pMs = (MOUSEHOOKSTRUCT *)lParam;
	HWND hWnd = ::GetParent(pMs->hwnd);

	switch (wParam)
	{
	case WM_LBUTTONDOWN:
	case WM_LBUTTONUP:
	case WM_NCMOUSEMOVE:
		//::SendMessage(g_pHandler->GetMainHwnd(), wParam, 0, (LPARAM)(&pMs->pt);
	{
		int i = 0;
		i++;
	}
		break;

	case WM_NCMOUSELEAVE:
		if (pClassform)
			pClassform->showCefBackBtn(false);
		break;

	case WM_NCMOUSEHOVER:
		if (pClassform)
			pClassform->showCefBackBtn(true);
		break;
	case WM_MOUSEMOVE:
		//::SendMessage(g_pHandler->GetMainHwnd(), wParam, 0, (LPARAM)(&pMs->pt);
	{
		int i = 0;
		i++;
	}


	default:
		break;
	}


	// return 1;  //表示對當前消息已經處理了,這樣消息也就不會向下傳遞
	return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);  //放行
}

 


    UnhookWindowsHookEx(g_hMouseHook);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章