Форум — Ответы ( К темам )
? | 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... |