設置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);