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