2010-12-10 5 views
22

Program komputerowy, który rozwijam, musi wiedzieć, jakie okna były aktywne podczas uruchamiania aplikacji. Obecnie wykonuje wywołanie GetForegroundWindow() (z user32.dll) co 250 ms. Podejście nie jest bardzo dokładne.Czy zdarzenie systemu Windows w aktywnym oknie zostało zmienione?

Czy istnieje zdarzenie Windows (WINAPI?), Które jest uruchamiane za każdym razem, gdy zmieniono aktywne okno (skupienie)? Chciałbym zasubskrybować moją funkcję zwrotną.

Dzięki.

+2

Bardzo dobra odpowiedź jest tutaj: http://stackoverflow.com/a/11943387/134761 – angularsen

Odpowiedz

28

Tak, można użyć funkcji SetWinEventHook.

hEvent = SetWinEventHook(EVENT_SYSTEM_FOREGROUND , 
    EVENT_SYSTEM_FOREGROUND , NULL, 
    WinEventProcCallback, 0, 0, 
    WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS); 

....... 

VOID CALLBACK WinEventProcCallback (HWINEVENTHOOK hWinEventHook, DWORD dwEvent, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime) 
{ 
    /* your code here */ 
} 
+1

Wygląda na to, że tego szukałem. Daj mi to sprawdzić. –

+0

Nigdy nie próbowałem EVENT_SYSTEM_FOREGROUND, ale podłączyłem zdarzenie EVENT_OBJECT_LOCATIONCHANGE, aby obsłużyć zmianę pozycji okna za pomocą SetWinEventHook i działało dobrze dla mnie. – DReJ

+6

Dlaczego istnieje odpowiedź C/C++ na pytanie C#? – Chris

2

Jest WM_ACTIVATE message, który jest wysyłany do aktywowanych i nieaktywnych okien.

+5

Nie tego szukam. Nie można subskrybować każdego okna w systemie. :) –

+0

@ Vasiliy Borovyak: Ach, nieważne - źle zrozumiałem, myśląc, że potrzebujesz tylko aktywnego stanu określonego okna. – Piskvor