我正在设置一个低级鼠标钩与SetWindowsHookEx
:
HANDLE handle = SetWindowsHookEx(WH_MOUSE_LL,
&callback,
GetModuleHandle(NULL),
NULL);
因为这是一个低级回调,所以它将在我自己的进程内执行;不执行 DLL 注入。
现在,我注意到回调有时(间接)从标准 API 函数调用,例如GetAncestor
, GetWindowRect
等等。看来这些可能会导致某些消息队列被刷新。
事实上,我的问题有三个……
-
什么时候调用回调?
可以从内部调用吗anyAPI函数?我怎么知道?
-
回调在哪个线程上执行?
它只会在安装钩子的线程上运行,还是系统可以在任何线程上调用它?
-
为什么首先将钩子实现为回调?
(Raymond Chen 在这里闲逛吗?)对我来说,将钩子简单地实现为(发送的)消息似乎更明智,就像几乎所有 Windows 的其余部分一样。对于消息,至少我知道哪些函数可以导致待发送的消息被处理(GetMessage
, PeekMessage
和其他一些),我会知道它们在哪个线程上处理(首先接收消息的线程)。
-
See 3.
-
里面写得很清楚文档 https://learn.microsoft.com/en-us/previous-versions/windows/desktop/legacy/ms644986%28v=vs.85%29:
[...] 但是,WH_MOUSE_LL 挂钩不会注入到另一个进程中。相反,上下文切换回安装钩子的进程,并在其原始上下文中调用它。然后上下文切换回生成事件的应用程序。 [...]该钩子在安装它的线程的上下文中被调用。
- 其实它is像这样实现:
[...] 该调用是通过向安装挂钩的线程发送消息来进行的。因此,安装钩子的线程必须有消息循环。
AFAIK, when your hook must be called Windows puts a special message in your thread's message queue. Your code in the message pump calls Peek/GetMessage, which checks if it's the special message and, if it is, it calls your hook procedure (some evidence here https://cboard.cprogramming.com/windows-programming/119909-setwindowshookex-lowlevelmouseproc.html, whence I took the image).
(source: cprogramming.com http://cboard.cprogramming.com/attachments/windows-programming/9323d1253895425-setwindowshookex-lowlevelmouseproc-hook-callback-callstack-png)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)