SetWindowsHookEx 问题的文档

Posted

技术标签:

【中文标题】SetWindowsHookEx 问题的文档【英文标题】:documentation of SetWindowsHookEx question 【发布时间】:2011-05-09 02:18:42 【问题描述】:

我不太了解SetWindowsHookEx() 的文档。我知道在第一个参数中应该放什么,但是对于第二个、第三个和第四个我很困惑。 第二个参数询问 HOOKPROC 是否就像普通的 windows proc 一样? 第三和第四我不明白。那你们能帮我解释一下吗?谢谢

【问题讨论】:

【参考方案1】:

Windows API 文档比这里的任何人都更好地解释了所有参数:http://msdn.microsoft.com/en-us/library/ms644990(v=vs.85).aspx

second 参数是 NULL 或指向 HOOKPROC 的指针。请注意,“如果 dwThreadId 参数为零或指定由不同进程创建的线程的标识符,则 lpfn 参数必须指向 DLL 中的挂钩过程。否则,lpfn 可以指向与当前进程。”下面是一个来自 MSDN 的 HOOKPROC 示例:

LRESULT CALLBACK HookProc(
  int nCode, 
  WPARAM wParam, 
  LPARAM lParam
)

   // process event
   ...

   return CallNextHookEx(NULL, nCode, wParam, lParam);

如果 dwThreadId 参数指定由当前进程创建的线程并且钩子过程在与当前进程关联的代码内,则 第三 参数必须设置为 NULL。

第四个是“钩子程序要关联的线程的标识符。如果此参数为零,则钩子程序与在同一桌面上运行的所有现有线程相关联调用线程。”

【讨论】:

等待...所以如果第四个参数不为 NULL,我将第三个参数设置为 NULL @Mike 是的,这是正确的,除非您想拦截来自同一桌面上所有线程的所有消息,否则您需要将第三个设置为 NULL,将第四个设置为 GetCurrentThreadId()。如果确实是答案,请单击该答案左上角旁边的复选标记。 @Mike 您需要在互联网上搜索从进程名称中获取进程 ID 的方法。很容易找到。 显然 Windows API 文档在解释参数方面做得并不好,否则@Mike 不会发布他的问题(而且我不会在搜索类似信息)。 HOOKPROC的签名根本就不解释了。一个合理的猜测应该是它与普通的 WndProc 相同 - 但同样合理的是,HOOKPROC 可以有一个由 SetWindowsHookEx 返回的钩子句柄的额外参数。 另外,第二个参数真的可以为NULL吗?我看不出这有什么意义,API 文档也没有提到这种可能性。

以上是关于SetWindowsHookEx 问题的文档的主要内容,如果未能解决你的问题,请参考以下文章

SetWindowsHookex Global 不是很全球化

SetWindowsHookEx - 防病毒问题

在win32中挂钩

增加 Windows 7 中的 SetWindowsHookEx 限制

用于 DeviceIOControl 的 SetWindowsHookEx,要使用啥 hookid?

在我的线程上下文中调用“SetWindowsHookEx”函数