Форум — Ответы     (  К темам )
 ?  maxim2: Как отловить показ окна в системе любого типа? (22-01-2003 08:51:59)
Привет всем!
То есть когда окно появляется на экране. Знаю что надо ставить хук, но не знаю на какое сообщение или еще что то.
 Devnvd (24-01-2003 12:26:40)
Для Win98, Win2000 можете использовать SetWinEventHook.
Для Win95, NT4.0 с оговорками-"Requires Active Accessibility 1.3 RDK on Windows NT 4.0 SP6 and Windows 95.".

HWINEVENTHOOK wHook=NULL;
//--- Для вывода комментария о событии ---
struct TMyComment{
DWORD event;
char comment[10];
};
TMyComment MyComment[]=
{
{ EVENT_OBJECT_CREATE,"CREATE"},
{ EVENT_OBJECT_DESTROY,"DESTROY"},
{ EVENT_OBJECT_SHOW,"SHOW"},
{ EVENT_OBJECT_HIDE,"HIDE"}
};
//-------------------------------------------
//Отработчик Hook'а
VOID CALLBACK WinEventProc(
HWINEVENTHOOK hWinEventHook,
DWORD event,
HWND hwnd,
LONG idObject,
LONG idChild,
DWORD dwEventThread,
DWORD dwmsEventTime )
{
AnsiString S;
for(int i=0; i < sizeof(MyComment)/sizeof(MyComment[0]); i++)
{
if(event==MyComment[i].event)
{
S.printf("%s 0x%.8x",MyComment[i].comment,hwnd);
break;
}
}
Form1->Label1->Caption=S;
}
//--------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
//Устанавливаем Hook на события:
// EVENT_OBJECT_CREATE,EVENT_OBJECT_DESTROY,
// EVENT_OBJECT_SHOW,EVENT_OBJECT_HIDE
wHook=SetWinEventHook(
EVENT_OBJECT_CREATE,
EVENT_OBJECT_HIDE,
NULL,
(WINEVENTPROC)WinEventProc,
0,
0,
WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS
);

}
//--------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
//Удаляем Hook
if(wHook)UnhookWinEvent(wHook);
wHook=NULL;
}

Для систем любого типа подойдёт обычный Hook(SetWindowsHookEx) WH_CBT на события:
HCBT_ACTIVATE,HCBT_CREATEWND,HCBT_DESTROYWND...