2010-05-27 4 views
3

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

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

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

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

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

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

+0

Я думаю, что вам не хватает имени функции во второй строке. И вы не опубликовали наиболее важный код: вызов «SetWindowsHookEx» и ваш обработчик hook. – interjay

+0

Предполагаю, что HHOOK rslt = (..) предполагается HHOOK rslt = SetWindowsHookEx (...); – Michael

+1

Вы уже вставляете DLL в каждый процесс. В чем проблема, вы разбиваете каждое приложение графического интерфейса, в том числе проводник Windows. Внесите его в свой первый, чтобы вы могли его отладить. –

ответ

1

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

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

0

Это код моей подключаемую процедуру, и она хранится в 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 .The HookProcDll.dll производится с длл проекта Visual Studio, так что я предполагаю, что это включает реализацию standrad для DllMain.

Смежные вопросы