Сообщений 0    Оценка 90        Оценить  
Система Orphus

HookHlpr.h – «помощник» установки хуков.

Автор: Игорь Вартанов
The RSDN Group
Опубликовано: 08.10.2002
Исправлено: 13.03.2005
Версия текста: 1.0

Исходный код
Демонстрационный проект

Назначение

Данный файл содержит код, облегчающий задачу постановки Windows-хуков. Он рассчитан на применение в коде, написанном на языках C и C++. За подробностями применения данного кода можно обратиться к статье «Создание инструментария для Windows-хуков (C и C++)».

Код для С

Макросы для локальных хуков:

DECLARE_LOCAL_HOOK( hook_message, HookProc )
SET_LOCAL_HOOK( hook_message )
UNHOOK_LOCAL_HOOK( hook_message )
IS_VALID_HOOK( hook_message )

Макросы для глобальных хуков:

DECLARE_GLOBAL_HOOK( hook_message, HookProc )
DECLARE_HOOK_DLL( hook_messge )
LOAD_HOOK_DLL( hook_message, libname )
UNLOAD_HOOK_DLL( hook_message )
IS_VALID_DLL_HOOK( hook_message )

Параметры макросов:

hook_message – тип хука

HookProc – имя процедуры-обработчика системных сообщений

libname – имя динамической библиотеки, содержащей код глобального хука

Код для С++

Шаблонный класс CHookBaseT<>:

// CHookBaseT class
// Тела методов класса не приводятся по причине значительного объема кода
// Полный код см. в HookHlpr.h

template <class T, class TData = CHookBaseData> 
class CHookBaseT
{
private:
    CHookThunk m_thunk;
    int        m_nCode;

protected:  
    TData* m_pData;
    
private:
    static LRESULT WINAPI _HookProc( T* pThis, WPARAM wParam, LPARAM lParam );

public:
    CHookBaseT() : m_pData(NULL){}
    CHookBaseT( TData* pData ) : m_pData(pData){}
    void Init();
    void SetHookHandle( HHOOK hHook );
    void SetHookType( int nHookType );
    BOOL SetHook( HINSTANCE hInst, DWORD dwThreadId );
    void Unhook();
    BOOL IsValid() const;
    inline HHOOK GetHookHandle() const;
    inline int GetHookType() const;
    inline int GetCode() const;
    void AttachData( TData* pData );
};

Макрос (применяется совместно с CHookBaseT<>, только для глобальных хуков):

ALLOCATE_GLOBAL_HOOK_OBJ( hook_class_name, hook_obj_name, data_class_name, data_obj_name )

Параметры макроса:

hook_class_name – имя класса, порожденного от CHookBaseT<> и реализующего процедуру-обработчик хука.

hook_obj_name – имя экземпляра класса хука

data_class_name - имя класса данных хука

data_obj_name – имя экземпляра класса данных хука


Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
    Сообщений 0    Оценка 90        Оценить