c++ - SetWindowsHookEx() 监控所有线程 : Must the hook procedure be located in a DLL?

标签 c++ windows dll

SetWindowsHookEx() monitoring all threads: Must the hook procedure be located in a DLL?

我很困惑监控所有线程的钩子(Hook)程序是否必须位于一个 DLL 中。

如以下教程所示,钩子(Hook)程序不需要位于 DLL 中。

http://www.unknowncheats.me/forum/c-and-c/83707-setwindowshookex-example.html

我是不是误会了什么?

最佳答案

  if (!(_hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0)))

这并没有错。这两个低级 Hook 与所有其他 Hook 不同,Windows 在将键盘或鼠标消息分派(dispatch)给拥有前台窗口的进程之前在您的进程中调用您的 Hook 回调。不需要也不使用 DLL。您确实需要启动消息循环 (GetMessage/DispatchMessage),Windows 只能在知道您的线程空闲并准备好执行代码时进行回调。

从 Windows 7 SP1 开始,可以为第三个参数传递 NULL。一个错误修复,以前的版本需要一个有效的 DLL 句柄,验证它但没有实际使用它。提供一个并因此确保您的代码与任何 Windows 版本兼容的最佳方法是使用从 LoadLibrary(L"user32.dll") 获得的代码。

请注意与 WH_KEYBOARD Hook 的区别,后者确实需要一个 DLL。最大的区别是它的回调更可靠,因为它在进程内运行,它知道进程的键盘状态。 GetKeyState() 是准确的,无法在 WH_KEYBOARD_LL Hook 中完成相同的操作。今天写这样一个钩子(Hook)是非常痛苦的,如果你需要 Hook 每个进程,UAC 抛出一个障碍(你不能注入(inject)一个提升的进程,除非你自己提升)以及需要写一个 32 位和一个 64 -bit 版本的 Hook 程序和 DLL。

关于c++ - SetWindowsHookEx() 监控所有线程 : Must the hook procedure be located in a DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35198423/

相关文章:

c++ - 如何替换 C++ 循环中的旧值?

windows - Delphi 7 写进程内存

c++ - 将dll导入C++程序

用于 C DLL 的 C 静态库 (.lib)

python - C++ Python 解释器 - Py_Initialize 崩溃

c++ - 使用多线程 boost 条件变量

c++ - 同一解决方案中的头文件

c# - 如何从 Windows 窗体连接到 MySQL?

windows - 在 Windows 中打开文件的最基本方法

c++ - 无法导出 DLL 中的函数