SetWindowsHookEx()监视所有线程:钩子程序必须位于DLL中吗?
我是否感到困惑,无论用于监视所有线程的钩子过程是否必须位于DLL中.
如下面的教程所示,声明钩子过程不需要位于DLL中.
http://www.unknowncheats.me/forum/c-and-c/83707-setwindowshookex-example.html
我误解了什么吗?
if (!(_hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0)))
Run Code Online (Sandbox Code Playgroud)
这不是非常错误的.两个低级别的钩子与其他所有钩子不同,Windows在将键盘或鼠标消息发送到拥有前台窗口的进程之前调用您的进程中的钩子回调.不需要也不使用DLL.你也需要泵消息循环(GetMessage函数/ DispatchMessage函数)时,Windows只能使回调时,它知道你的线程处于空闲状态,准备执行代码.
从Windows 7 SP1开始,可以为第3个参数传递NULL.一个错误修复,以前的版本需要一个有效的DLL句柄,验证它但实际上没有使用它.提供一个并确保您的代码与任何Windows版本兼容的最佳方法是使用从LoadLibrary(L"user32.dll")获得的代码.
请注意与WH_KEYBOARD挂钩的区别,它确实需要DLL.最大的区别在于它的回调更可靠,因为它在进程中运行它知道进程的键盘状态.GetKeyState()是准确的,没有办法在WH_KEYBOARD_LL钩子中完成相同的操作.如果你需要挂钩每个进程,写一个这样的钩子是非常痛苦的,UAC会引发一个障碍(除非你自己提升,否则不能注入提升的进程)以及编写32位和64位的需要你的挂钩程序和DLL的位版本.