windows钩子函数
关于钩子的理解:
windows应用程序是基于消息驱动的。
windows钩子可以监视指定窗口的某种类型的消息。
当监视的消息到达该指定的窗口时,在该窗口处理消息前,钩子函数将截获此消息。
钩子函数既可以拦截处理此消息,也可以不做任何处理将该消息传递下去。
相关函数:
HHOOK hHook = NULL;
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam) //钩子函数
{
if (code == HC_ACTION)
{
PKBDLLHOOKSTRUCT param = (PKBDLLHOOKSTRUCT)lParam;
int x = 1;
}
return CallNextHookEx(hHook, HC_ACTION, wParam, lParam);
}
DLL_HOOK_GETKEYBOARD_API bool KeyboardDll::initKeyboardHook() //加载钩子
{
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0);
if (hHook == NULL)
{
printf("SetWindowsHookEx() error :%d\n", GetLastError());
return false;
}
return true;
}
DLL_HOOK_GETKEYBOARD_API bool KeyboardDll::stopHook() //卸载钩子
{
if (UnhookWindowsHookEx(hHook) == FALSE)
{
printf("UnhookWindowsHookEx() error :%d\n");
return false;
}
fclose(fp);
return true;
}
SetWindowsHookEx函数介绍:
SetWindowsHookEx(
int idHook, //要安装的钩子的类型。
HOOKPROC lpfn, //钩子函数的地址。
HINSTANCE hMode, //钩子函数DLL在进程内的地址。当前进程中,此参数应被指定为NULL.
DWORD dwThread, //要安装钩子的线程。如为0,则为所有线程安装钩子。
//如果只检测本进程,可用GetCurrentThreadId()
);
BOOL UnhookWindowsHookEx(HHOOK hhk);
问题:为什么钩子函数必须在动态库中实现???写在主程序内时只可以在主程序内安装钩子。
HOOK技术 可以只hook本进程的消息,这样不需要全局钩子,不用写在dll中。
但如果需要hook其他进程或者全部进程,就需要全局钩子,必须利用dll实现。
因为每个进程有自己独立的进程内存空间,捕获其消息,需要windows将hook加载到其进程空间中,
而实现这个最好的方法,就是用DLL来实现。系统会自动把该DLL注入到所有的进程空间中。
也就是每个进程都将自动加载此动态库。调用钩子函数来处理捕获消息。
关于钩子的理解:
windows应用程序是基于消息驱动的。
windows钩子可以监视指定窗口的某种类型的消息。
当监视的消息到达该指定的窗口时,在该窗口处理消息前,钩子函数将截获此消息。
钩子函数既可以拦截处理此消息,也可以不做任何处理将该消息传递下去。
相关函数:
HHOOK hHook = NULL;
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam) //钩子函数
{
if (code == HC_ACTION)
{
PKBDLLHOOKSTRUCT param = (PKBDLLHOOKSTRUCT)lParam;
int x = 1;
}
return CallNextHookEx(hHook, HC_ACTION, wParam, lParam);
}
DLL_HOOK_GETKEYBOARD_API bool KeyboardDll::initKeyboardHook() //加载钩子
{
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0);
if (hHook == NULL)
{
printf("SetWindowsHookEx() error :%d\n", GetLastError());
return false;
}
return true;
}
DLL_HOOK_GETKEYBOARD_API bool KeyboardDll::stopHook() //卸载钩子
{
if (UnhookWindowsHookEx(hHook) == FALSE)
{
printf("UnhookWindowsHookEx() error :%d\n");
return false;
}
fclose(fp);
return true;
}
SetWindowsHookEx函数介绍:
SetWindowsHookEx(
int idHook, //要安装的钩子的类型。
HOOKPROC lpfn, //钩子函数的地址。
HINSTANCE hMode, //钩子函数DLL在进程内的地址。当前进程中,此参数应被指定为NULL.
DWORD dwThread, //要安装钩子的线程。如为0,则为所有线程安装钩子。
//如果只检测本进程,可用GetCurrentThreadId()
);
BOOL UnhookWindowsHookEx(HHOOK hhk);
问题:为什么钩子函数必须在动态库中实现???写在主程序内时只可以在主程序内安装钩子。
HOOK技术 可以只hook本进程的消息,这样不需要全局钩子,不用写在dll中。
但如果需要hook其他进程或者全部进程,就需要全局钩子,必须利用dll实现。
因为每个进程有自己独立的进程内存空间,捕获其消息,需要windows将hook加载到其进程空间中,
而实现这个最好的方法,就是用DLL来实现。系统会自动把该DLL注入到所有的进程空间中。
也就是每个进程都将自动加载此动态库。调用钩子函数来处理捕获消息。