Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> не работает глрбальный хук 
:(
    Опции темы
olyx
Дата 26.1.2007, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 26.1.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 менять их размер.
PM MAIL   Вверх
Aleksandor
Дата 27.1.2007, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

Репутация: 10
Всего: 12



Может дело вот в этом?

Filter functions for systemwide hooks must be prepared to share any data they need across the different processes they are running from. A DLL is mapped into the address space of each of its client processes. Global variables within the DLL will be instance specific unless they are placed in a shared data section. For example, the HOOKSDLL.DLL library in the Hooks sample application needs to share two data items: 

The window handle to display messages.


The height of the text lines in that window. 
To share this data, HOOKSDLL puts these data items in a shared data section. Here are the steps HOOKSDLL takes to share the data: 

Use pragmas to place the data in a named data segment. Note that the data must be initialized for this to work. 
// Shared DATA
#pragma data_seg(".SHARDATA")
static HWND   hwndMain = NULL;  // Main hwnd. We will get this from the app.
static int    nLineHeight = 0;  // Height of lines in window.
#pragma data_seg()

Add a SECTIONS statement to the DLL's .DEF file: 
SECTIONS
   .SHARDATA   Read Write Shared

Create an .EXP file from the .DEF file: 
hooksdll.exp: hooksdll.obj hooksdll.def
    $(implib) -machine:$(CPU)     \
   -def:hooks.def      \
   hooksdll.obj  \
   -out:hooksdll.lib

Link with the HOOKSDLL.EXP file: 
hooksdll.dll: hooksdll.obj hooksdll.def hooksdll.lib hooksdll.exp
    $(link) $(linkdebug)     \
    -base:0x1C000000  \
    -dll       \
   -entry:LibMain$(DLLENTRY)     \
   -out:hooksdll.dll    \
   hooksdll.exp hooksdll.obj hooksdll.rbj \
   $(guilibsdll)




--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
olyx
Дата 29.1.2007, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 26.1.2007

Репутация: нет
Всего: нет



я уже разобрался в чём дело было  smile . А дело было в том, что я использовал не тот тип хука - WH_CBT, который есть хук только для какихто Computer-based training приложений. Вместо этого я использовал хук WH_CALLWNDPROC и отлавливал сообщение WM_GETMINMAXINFO для подмены макс. значения размеров окна.
А то что сий процесс не отлавливался в дебагере - оно и понятно - ведь для других придожений подгружался свой инстанс библиотеки, на который дебагер небыл "натравлен".
PM MAIL   Вверх
dumb
Дата 29.1.2007, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Цитата(olyx @  29.1.2007,  09:14 Найти цитируемый пост)
А дело было в том, что я использовал не тот тип хука - WH_CBT, который есть хук только для какихто Computer-based training приложений.

не "только для какихто". словарик пользуй.

Цитата(msdn)

The WH_CBT hook is intended primarily for computer-based training (CBT) applications.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0478 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.