Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

не работает глрбальный хук

17K
26 января 2007 года
olyx
13 / / 26.01.2007
Доброго всем времени суток!
Столкнулся вот с такой непонятной проблемой: есть hklib.dll устанавливающая глобальный хук, есть приложение oometapanel.exe которое устанавливает хук через ДЛЛ. Но сам хук срабатывает только для oometapanel.exe (ставил брекпоинт на OOMaximizeHook), хотя создан по всем правилам глобального хука, и по идее должен ловить сообщения от всех приложений. Перерыл кучу информации, но в чём загвоздка не нашел.
Привожу код:
hklib.cpp - модуль ДЛЛки
Код:
#include "afx.h"   
#include "stdafx.h"
#include "hklib.h" 
#include <TCHAR.H >
#pragma data_seg(".OLEG")  
HHOOK MyHook = NULL;   
#pragma data_seg() 
#pragma comment(linker, "/section:.OLEG,rws")  
HINSTANCE hinstDLL;    
#ifdef _MANAGED
#pragma managed(push, off) 
#endif 
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,  
                       LPVOID lpReserved   
                     ) 
{  
    switch(ul_reason_for_call){
        case DLL_PROCESS_ATTACH:   
            hinstDLL = hModule;
            return TRUE;   
    }  
    return TRUE;   
}  
HookEXPORT BOOL SetOOMaximizeHook(void)
  {
    MyHook = SetWindowsHookEx(WH_CBT,(HOOKPROC)OOMaximizeHook,hinstDLL,0);     
    if(MyHook != NULL) 
    { /* success */
        return TRUE;   
    } /* success */
    return FALSE;  
  }; // SetMyHook  
HookEXPORT BOOL ClearOOMaximizeHook(void)  
   {   
    BOOL unhooked = UnhookWindowsHookEx(MyHook);   
    return unhooked;   
   };  
LRESULT CALLBACK OOMaximizeHook(int nCode, WPARAM wParam, LPARAM lParam)   
    {  
        TCHAR NameOfClass[255] = {0};  
        if (nCode==HCBT_MINMAX && lParam==SW_MAXIMIZE){
            GetClassName(HWND(wParam), NameOfClass, 255);  
            if(_tcsstr(NameOfClass, _T("SALFRAME")) != NULL){  
                MoveWindow(HWND(wParam), 200,200,200,200,1);       
            }  
        }; 
        // Pass the message on to the next hook
        return CallNextHookEx(MyHook, nCode,    
                           wParam, lParam);
   };  
#ifdef _MANAGED
#pragma managed(pop)   
#endif

hklib.h - заголовок ДЛЛки
 
Код:
#define HookEXPORT extern "C" __declspec(dllexport)
HookEXPORT BOOL SetOOMaximizeHook(void);   
HookEXPORT BOOL ClearOOMaximizeHook(void); 
LRESULT CALLBACK OOMaximizeHook(int nCode, WPARAM wParam, LPARAM lParam);

metapanel.cpp - главный модуль приложения
Код:
#pragma once   
#include "stdafx.h"
#include "Form1.h" 
#include <windows.h>   
[STAThreadAttribute]   
int main(array<System::String ^> ^args)
{  
    typedef bool (SetOOMaximizeHook)(void);
    typedef bool (ClearOOMaximizeHook)(void);  
    SetOOMaximizeHook* pSetOOMaximizeHook; 
    ClearOOMaximizeHook* pClearOOMaximizeHook; 
    HINSTANCE hinstDLL;    
    LPCSTR FuncName;   
    DWORD Err; 
    bool result;   
    // Enabling Windows XP visual effects before any controls are created  
    //Application::EnableVisualStyles();   
    Application::SetCompatibleTextRenderingDefault(false);  
    hinstDLL = ::LoadLibrary(_T("hklib.dll")); 
    FuncName = "SetOOMaximizeHook";
    pSetOOMaximizeHook = (SetOOMaximizeHook*)::GetProcAddress((HMODULE)hinstDLL, FuncName);
    Err = GetLastError();  
    if (pSetOOMaximizeHook)
        result = (*pSetOOMaximizeHook)();  
    if (result)Debug::Print("Hook installed"); 
    else Debug::Print("Hook install failed");  
    // Create the main window and run it   
    Application::Run(gcnew Form1());   
    FuncName = "ClearOOMaximizeHook";  
    pClearOOMaximizeHook = (ClearOOMaximizeHook*)::GetProcAddress((HMODULE)hinstDLL, FuncName);
    Err = GetLastError();  
    if (pClearOOMaximizeHook)  
        result = (*pClearOOMaximizeHook)();
    ::FreeLibrary(hinstDLL);   
    if (result) Debug::Print("Hook uninstalled");  
    else Debug::Print("Hook uninstall failed");
    return 0;  
}

Суть кода - при развертывании окна приложений OprnOffice.org менять их размер.
8.9K
28 января 2007 года
Kap
77 / / 10.09.2006
Прогу в архив и на сервер, если она, конечно, не содержит особенных секретов.
17K
29 января 2007 года
olyx
13 / / 26.01.2007
я уже разобрался в чём дело было :yasno . А дело было в том, что я использовал не тот тип хука - WH_CBT, который есть хук только для какихто Computer-based training приложений. Вместо этого я использовал хук WH_CALLWNDPROC и отлавливал сообщение WM_GETMINMAXINFO для подмены макс. значения размеров окна.
А то что сий процесс не отлавливался в дебагере - оно и понятно - ведь для других придожений подгружался свой инстанс библиотеки, на который дебагер небыл "натравлен".
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог