Как установить глобальный хук для WH_CALLWNDPROCRET? - PullRequest
3 голосов
/ 28 мая 2010

Я хочу установить глобальный хук, который отслеживает, какое приложение активно.

В своей основной программе я делаю следующее:

HMODULE mod=::GetModuleHandle(L"HookProcDll");
HHOOK rslt=(WH_CALLWNDPROCRET,MyCallWndRetProc,mod,0);

Подключаемая процедура, которая называется MyCallWndRetProc, существует в отдельной dll, называемой HookProcDll.dll. Процедура ловушки отслеживает сообщение WM_ACTIVATE.

Дело в том, что код застрял в строке, где я устанавливаю ловушку, т.е. в строке, где я звоню ::SetWindowsHookEx. И тогда Windows перестает отвечать на запросы, моя панель задач исчезает, и у меня остается пустой рабочий стол. Тогда я должен перезагрузить компьютер.

Что я делаю не так, почему Windows перестает отвечать на запросы? а также Нужно ли внедрять HookProcDll.dll в каждый процесс, чтобы установить глобальный хук, и как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 28 мая 2010

Это почти наверняка звучит как сбой в MyCallWndRetProc. Вы указываете свою подключаемую DLL для загрузки в каждый процесс с окном, и она падает, когда MyCallWndRetProc вызывается после сообщения окна. Так как он вызывается после каждого оконного сообщения в каждом процессе, он в конечном итоге отключит каждый процесс, отображающий пользовательский интерфейс в пользовательском сеансе. Вы даже не можете запускать новые приложения, так как ваш ловушка будет немедленно загружена в них.

Включение кода в MyCallWndRetProc и, возможно, вашего DllMain также должно дать нам некоторое представление о том, что происходит.

0 голосов
/ 28 мая 2010

Это код для моей процедуры подключения, и он хранится в HookProcDll.dll:

#include "HookProcDll.h"
LRESULT CALLBACK MyCallWndRetProc(
  __in  int nCode,
  __in  WPARAM wParam, /* whether the msg is sent by the current process */
  __in  LPARAM lParam  /* pointer to CWPRETSTRUCT , which specifies details about the message */
)
{
    if(nCode >=0)
    {
        CWPRETSTRUCT* retStruct=(CWPRETSTRUCT*)lParam;
        if(retStruct->message == WM_ACTIVATE)
        {

        }
    }
    return ::CallNextHookEx(0,nCode,wParam,lParam);
}

Мой HookProcDll.dll не имеет явной функции DllMain. HookProcDll.dll сделан с проектом Visual Studio DLL, поэтому я предполагаю, что он включает стандартную реализацию для DllMain.

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