PostMessage и CALLWNDHOOK, отсутствуют зарегистрированные сообщения? - PullRequest
0 голосов
/ 04 апреля 2009

Вот ситуация. У меня есть два разных оконных хука, один глобальный хук разнообразия 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>

Спасибо
-Кевин Монтроз

Ответы [ 2 ]

2 голосов
/ 04 апреля 2009

Хотя @Michael правильно относится к использованию WM_USER сообщений (их следует использовать только в приложении - зарегистрированные сообщения - лучший способ перейти сюда), в то же время я думаю, что причина, по которой вы их не получаете, связана с характером хука CallWndProc и отправленных сообщений. Я не уверен, но я думаю, что вы хотите подключить хук GetMessage для опубликованных сообщений.

Другой вариант - перехватить хук Debug, который получает все сообщения до всех других хуков. Вы могли бы проследить за вашим пользовательским сообщением, а затем определить, какой хук (если есть) получил ваше пользовательское сообщение.

РЕДАКТИРОВАТЬ: Для отладки хуков, просто присоедините к рассматриваемому процессу и установите точку останова в вашей процедуре хука. В конечном итоге это самый простой способ отладки.

0 голосов
/ 04 апреля 2009

Думаю, я понял это. Простой случай не совсем захватывающей документации.

Мой хук CallWndProc вел себя так, как если бы nCode, wParam и lParam были тем, что передавалось бы перехваченным потокам WndProc. Фактически, lParam содержал указатель на CWPSTRUCT; читать данные из этой структуры, и все работает отлично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...