【发布时间】:2011-01-04 20:16:07
【问题描述】:
我正在用SetWindowsHookEx 设置一个低级鼠标钩子:
HANDLE handle = SetWindowsHookEx(WH_MOUSE_LL,
&callback,
GetModuleHandle(NULL),
NULL);
因为这是一个低级回调,所以会在我自己的进程内部执行;不执行 DLL 注入。
现在,我注意到有时(间接地)从标准 API 函数(例如 GetAncestor、GetWindowRect 等)调用回调。似乎这些会导致一些消息队列被刷新。
其实,我的问题有三个……
-
什么时候调用回调?
可以从 any API 函数内部调用它吗?我怎么知道?
-
回调在哪个线程上执行?
它会只在安装了钩子的线程上运行,还是系统可以在任何线程上调用它?
-
为什么首先将钩子实现为回调?
(Raymond Chen 会在这里闲逛吗?)对我来说,将钩子简单地实现为(发送)消息似乎更明智,就像几乎所有其他 Windows 一样。对于消息,至少我知道哪些函数可以导致处理待处理的已发送消息(
GetMessage、PeekMessage和其他一些),并且我会知道它们在哪个线程上被处理(接收消息的线程在第一名)。
【问题讨论】:
标签: winapi multithreading hook