Я устанавливаю низкоуровневый крючок для мыши с SetWindowsHookEx
:
HANDLE handle = SetWindowsHookEx(WH_MOUSE_LL,
&callback,
GetModuleHandle(NULL),
NULL);
Поскольку это обратный вызов низкого уровня, он будет выполняться внутри моего собственного процесса; DLL-инъекция не выполняется.
Теперь я заметил, что обратный вызов иногда (косвенно) вызывается из стандартных функций API, таких как GetAncestor
, GetWindowRect
и тому подобное. Похоже, это может привести к сбросу очереди сообщений.
На самом деле, мой вопрос тройной ...
Когда вызывается обратный вызов?
Может ли она вызываться изнутри любой API-функции? Как мне сказать?
В каком потоке выполняется обратный вызов?
Будет ли он выполняться только в потоке, который установил хук, или система может вызвать его в любом потоке?
Почему хуки реализованы как обратный вызов?
(Рэймонд Чен тут болтается?) Мне бы показалось более разумным реализовывать перехватчики просто как (отправленные) сообщения, как и почти все остальные компоненты Windows. Для сообщений, по крайней мере, я знаю, какие функции могут вызвать обработку ожидающих отправленных сообщений (GetMessage
, PeekMessage
и несколько других), и я бы знал, в каком потоке они обрабатываются (поток, который получил сообщение в первое место).