Вот ситуация. У меня есть два разных оконных хука, один глобальный хук разнообразия WH_SHELL, который следит за новыми окнами верхнего уровня, второй - хук потока WH_CALLWNDPROC, который устанавливается в некоторых из окон верхнего уровня, обнаруженных первым крюк. Два хука реализованы в разных DLL.
Насколько я могу судить, оба крючка установлены правильно. Тем не менее, я ничего не отправляю в окна перехвата с кодом сообщения> WM_USER , когда регистрационное сообщение когда-либо обрабатывается пользовательским перехватчиком WH_CALLWNDPROC, но "нормальные" сообщения окон передаются, хотя это нормально.
Код, который перехватывает обнаруженное окно:
... Getting handle, mod, and procHook ...
DWORD threadId = GetWindowThreadProcessId(handle, NULL);
HHOOK hook = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)procHook, mod, threadId);
if(!PostMessage(handle, CUSTOM_MESSAGE, NULL, NULL))
{
... fetch and print error message ...
}
Тело самого крючка:
... Report sends a message to an agreed upon window with the passed wParam & lParam
Report(20, nCode);
if(nCode == CUSTOM_MESSAGE)
{
... This code is never reached ...
Report(50, ERROR_SUCCESS);
if(PerformTask())
Report(200, ERROR_SUCCESS);
else
Report(400, ERROR_SUCCESS);
}
... More code handling more messages in the same basic form
Первый вызов Report - это то, что подтверждает, что хук установлен и работает, так как он отправляет обратно кучу сообщений в возрасте до 20 лет (ERASEBACKGROUND, PAINT и т. Д.).
CUSTOM_MESSAGE определяется как WM_USER + 314. Сообщение, используемое для отчета (...): WM_USER + 317.
С тех пор я обновил свой код, чтобы использовать RegisterWindowMessage для получения UINT для отправки, с моей стороны было неправильно использовать WM_USER для межпроцессного взаимодействия.
Итак, в принципе, что не так с моим дизайном или использованием хуков Windows и PostMessage? Если я пропустил какие-либо детали, дайте мне знать; здесь задействовано много кода, и это уже довольно большой вопрос, поэтому я постарался включить только то, что считаю уместным.
Кроме того, существует ли согласованный лучший способ отладки хуков? Я использовал моральный эквивалент cout << ... всего, отправляя сообщения в согласованное окно и отлаживая его WndProc. </p>
Спасибо
-Кевин Монтроз