//"UMyDLL.h"
#ifndef _UHOTKEY_H
#define _UHOTKEY_H
#ifdef __DLL__
#define DLL_EI __declspec(dllexport)
#else
#define DLL_EI __declspec(dllimport)
#endif
extern "C" void DLL_EI StartHook();
extern "C" void DLL_EI RemoveHook();
#endif
//*********************************
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#pragma argsused
#include "UMyDLL.h"
HHOOK HKey = 0;
int _stdcall Tracer_Hook(int code, int wParam, int lParam)
{
/*
if (code > 0 && wParam == HCBT_CREATEWND)
{
return 1;
}
else
{
return CallNextHookEx(HKey, code, wParam, lParam);
}
*/
}
void StartHook()
{
HKey = SetWindowsHookEx(WH_CBT,(WNDENUMPROC)Tracer_Hook,HInstance,0);
if (HKey==0)
{
MessageBox(0, "Не удалось включить отслеживание программы Tracer", "Ошибка", MB_OK);
}
}
void RemoveHook()
{
if (HKey!=0)
{
UnhookWindowsHookEx(HKey);
HKey = 0;
}
}
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
if((reason == DLL_THREAD_DETACH) || (reason == DLL_PROCESS_DETACH))
{
if (HKey!=0)
UnhookWindowsHookEx(HKey);
}
return 1;
}
//---------------------------------------------------------------------------
Глобальный хук
[FONT=Arial]Как это реализовать? Что использовать: [/FONT]
[FONT=Arial]WH_SHELL [/FONT]
[FONT=Arial]WH_CALLWNDPROC [/FONT]
[FONT=Arial]WH_CBT[/FONT]
[FONT=Arial]?[/FONT]
[FONT=Arial]и как должен выглядить код функции Tracer_Hook? [/FONT]
Код:
Код:
HWND hTracerHandle = NULL; // Handle главного окна приложения
..........................................................................................
int _stdcall Tracer_Hook(int code, int wParam, int lParam)
{
if (code == HCBT_CREATEWND) // Окно создается
{
LPCBT_CREATEWND pCBTCreateWnd = (LPCBT_CREATEWND)lParam;
// То ли это окно, которое нам нужно
// можно определить по каким либо признакам из CREATESTRUCT
// здесь определяю по заголовку окна
if ( strcmp(pCBTCreateWnd->lpcs->lpszName, ...) == 0 )
{
hTracerHandle = (HWND)wParam;
//Какие-то действия при запуске приложения
}
}
else if (code == HCBT_DESTROYWND)
{
if ( (hTracerHandle != NULL) && (hTracerHandle == (HWND)wParam) )
{
hTracerHandle = NULL;
//Какие-то действия при завершении приложения
}
}
return CallNextHookEx(HKey, code, wParam, lParam);
}
..........................................................................................
int _stdcall Tracer_Hook(int code, int wParam, int lParam)
{
if (code == HCBT_CREATEWND) // Окно создается
{
LPCBT_CREATEWND pCBTCreateWnd = (LPCBT_CREATEWND)lParam;
// То ли это окно, которое нам нужно
// можно определить по каким либо признакам из CREATESTRUCT
// здесь определяю по заголовку окна
if ( strcmp(pCBTCreateWnd->lpcs->lpszName, ...) == 0 )
{
hTracerHandle = (HWND)wParam;
//Какие-то действия при запуске приложения
}
}
else if (code == HCBT_DESTROYWND)
{
if ( (hTracerHandle != NULL) && (hTracerHandle == (HWND)wParam) )
{
hTracerHandle = NULL;
//Какие-то действия при завершении приложения
}
}
return CallNextHookEx(HKey, code, wParam, lParam);
}
(Код не тестировал, но думаю должен работать).
Если же у приложения окна, создаваемого при запуске, нет, тогда попробуйте посмотреть здесь например
http://forum.ru-board.com/topic.cgi?forum=33&topic=9217