Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> хук не работает глобально 
:(
    Опции темы
Ant-on
Дата 16.10.2003, 18:29 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Помогите, дедлайн на носу, а на VC++ перешел недавно.

есть задача - отследить создание определенного окна. Пытаюсь сделать через глобальный хук WH_SHELL, ссобщение HSHELL_WINDOWCREATED. Но по пути наступаю на грабли: хук действеннен только для окна приложения. При компилировании и отладке проблем не наблюдается. Вроде бы с обеспечением глобальности переменных все правильно - делается через mapped file (см. фрагмент исходника ниже):

typedef struct
{
UINT MsgCode;
HWND MsgTarget;
HHOOK hkShell;
int nCount;
int fhandle;
} MAPPED_AREA;


typedef MAPPED_AREA* PMAPPED_AREA;

PMAPPED_AREA lpvMem;

#define SHARED_NAME "SHARED_MEM_AREA6"


LRESULT CALLBACK TheShellProc(int nCode,WPARAM wParam, LPARAM lParam);

// предполагается инициализация при каждом аттаче
static HANDLE hMapObject = NULL;


BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
BOOL fInit, fIgnore;

switch (ul_reason_for_call)
{
// The DLL is loading due to process
// initialization or a call to LoadLibrary.

case DLL_PROCESS_ATTACH:

// Ниже создается отображение MMF. Полет нормальный.

// Create a named file mapping object.

hMapObject = CreateFileMapping(INVALID_HANDLE_VALUE, NULL,PAGE_READWRITE,0,sizeof(MAPPED_AREA),SHARED_NAME);

if (hMapObject == NULL)
return FALSE;

// The first process to attach initializes memory.

fInit = (GetLastError() != ERROR_ALREADY_EXISTS);

// Get a pointer to the file-mapped shared memory.

lpvMem = (PMAPPED_AREA)MapViewOfFile(MapObject,FILE_MAP_WRITE,0,0,0);



if (lpvMem == NULL)
return FALSE;


// Действия при инициализации

if(fInit)
{
memset((void*)lpvMem,0,sizeof(MAPPED_AREA));
SetLastError(0);
lpvMem->hkShell=SetWindowsHookEx(WH_SHELL,(HOOKPROC)TheShellProc,(HINSTANCE)hModule,0);
// И так далее...
}

break;

case DLL_THREAD_DETACH:
break;

// The DLL is unloading from a process due to
// process termination or a call to FreeLibrary.

case DLL_PROCESS_DETACH:

// Действия при детаче экземпялра длл

UnhookWindowsHookEx(lpvMem->hkShell);

// Unmap shared memory from the process's address space.

fIgnore = UnmapViewOfFile(lpvMem);

// Close the process's handle to the file-mapping object.

fIgnore = CloseHandle(hMapObject);
//...

break;

default:
break;
}

return TRUE;

}


LRESULT CALLBACK TheShellProc(int nCode,WPARAM wParam, LPARAM lParam)
{

if(nCode>=0)
{
lpvMem->nCount++;
if(nCode==HSHELL_WINDOWCREATED)

{ // Здесь узнается caption окна и проводятся дальнейшие действия
char stWindowName[128];

GetWindowText((HWND)wParam,(LPSTR)&stWindowName,sizeof(stWindowName));

}


}

return CallNextHookEx(lpvMem->hkShell,nCode,wParam,lParam);
}


  Вверх
Ars
Дата 17.10.2003, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 28.8.2003
Где: Московская обл.

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



Во ты извратился wow.gif
Вот так работает
Код
#include <windows.h>
#pragma hdrstop
//---------------------------------------------------------------------------
HINSTANCE hModule=NULL;
HHOOK hHook=NULL;
//---------------------------------------------------------------------------
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
hModule=hinst;
return 1;
}
//---------------------------------------------------------------------------
LRESULT CALLBACK HookShellProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(nCode==HSHELL_WINDOWCREATED)
{
 char WndText[256]="";
 if(GetWindowText((HWND)wParam,WndText,sizeof(WndText)) &&
  strcmp(WndText,"Hooked")) MessageBox(NULL,WndText,"Hooked",MB_OK);
}
return CallNextHookEx(hHook,nCode,wParam,lParam);
}
//---------------------------------------------------------------------------
STDAPI __export HookShell(void)
{
if(!hHook) hHook=SetWindowsHookEx(WH_SHELL,(HOOKPROC)HookShellProc,hModule,0);
return (int)hHook;
}
//---------------------------------------------------------------------------
STDAPI __export UnhookShell(void)
{
if(hHook) UnhookWindowsHookEx(hHook);
return (int)hHook;
}
//---------------------------------------------------------------------------

Вызов:
Код
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HINSTANCE hinstDLL=LoadLibrary("HookProc.dll");
int (__stdcall *HookShell)()=GetProcAddress(hinstDLL,"HookShell");
int (__stdcall *UnhookShell)()=GetProcAddress(hinstDLL,"UnhookShell");
if(HookShell && HookShell())
{
 ShowMessage("HookApplication");
 UnhookShell();
}
if(hinstDLL) FreeLibrary(hinstDLL);
return 0;
}


А вообще пишут, что хук-процедура вызывается в контексте отхученного процесса, т.е. в нем выполняется загрузка dll и вызов по адресу, переданному в SetWindowsHookEx. И у тебя в DLL_PROCESS_ATTACH постоянно будет производится добавление хук-процедуры к существующей цепочке хуков при создании каждого нового процесса. Что после этого будет - одному Билли известно smile.gif


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

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


 




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


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

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