2009-01-21 11 views
17

Używanie Win32 API (w języku C, ale to nieistotne) jak mogę stwierdzić, czy określone okno (zidentyfikowane przez HWND) jest aktywne? Pobiegam aplikację obserwującą wydarzenie, a kiedy to zdarzenie się pojawi, chcę sprawdzić, czy aplikacja już się skupiła. Jeśli tak nie jest, chcę przesłonić okno, dopóki nie skupią się na nim.Jak mogę sprawdzić, czy okno ma fokus? (Win32 API)

Alternatywnie, czy flaga strukturalna FlashWindowEx FLASHW_TIMERNOFG, która miga, dopóki okno nie zostanie ustawione, nie miga, jeśli okno ma już fokus? Nie mogę tego przetestować teraz, ponieważ nie jestem w moim środowisku programistycznym, ale miałem wrażenie, że i tak się to zaświeci, czego właśnie próbuję uniknąć.

Edytuj: Ponadto, jeśli ma to znaczenie, aplikacja korzysta z DirectX w tym oknie.

+0

Czy chcesz zapytać, "czy to okno ma fokus", czy "czy okna aplikacji mają fokus"? – ChrisW

+0

Zauważyłem w komentarzu poniżej, że ta aplikacja będzie miała tylko jedno okno. –

Odpowiedz

23

GetActiveWindow zwróci okno najwyższego poziomu powiązane z ogniskiem wejściowym. GetFocus zwróci uchwyt okna, które ma fokus wejściowy.

Ten artykuł może pomóc:
http://www.microsoft.com/msj/0397/Win32/Win320397.aspx

+0

To narzędzie jest niesamowite! –

+0

Link nie jest już dostępny w pokazanej lokalizacji, ale jest dostępny jako zarchiwizowany: [web.archive.org/web/200308](https://web.archive.org/web/20030807084141/http://www. microsoft.com/msj/0397/Win32/Win320397.aspx) – Sabuncu

7

Czy naprawdę masz na myśli "skupienie" lub masz na myśli "aktywny"?

Jedno okno ma fokus - to pierwsze w kolejności, aby uzyskać zdarzenia klawiatury. Zewnętrzne okno (które użytkownik może przeciągać po ekranie) jest "aktywne", jeśli jedno z jego okien dialogowych ma fokus, ale może ono samo lub nie mieć ostrości.

+1

Aplikacja będzie miała tylko jedno okno, brak okien podrzędnych lub podrzędnych. –

13

Poza gkrogers odpowiedź za pomocą GetActiveWindow, można również utrzymywać zmienną logiczną dla okna chcesz wiedzieć, czy to ma koncentrować się lub nie zatrzymując wydarzenia WM_SETFOCUS i WM_KILLFOCUS, lub WM_ACTIVATE

WndProc() .. 
case WM_SETFOCUS: 
    puts("Got the focus") ; 
    break ; 

case WM_KILLFOCUS: 
    puts("Lost the focus") ; 
    break; 

case WM_ACTIVATE: 
    if(LOWORD(wparam) == WA_ACTIVE) 
    puts("MEGAZORD ACTIVATED kew kew kew (flashy-eyes)") ; 
    else 
    puts("I AM NOW INACTIVE.") ; 
    break ; 
+0

Uwielbiam przykład. – Xcalibur37

4

funkcja Zastosowanie GetForegroundWindow uzyskać hWND, które skupiają się teraz. Następnie wystarczy porównać go z oknem aplikacji, aby sprawdzić, czy zawiera fokus, czy nie.

Powiązane problemy