2009-01-21 10 views
17

En utilisant l'API Win32 (en C, mais c'est sans conséquence) comment puis-je savoir si une fenêtre donnée (identifiée par HWND) a un focus? Je suis en train d'accrocher une application à la recherche d'un événement, et quand cet événement se produit, je veux vérifier si l'application a déjà le focus. Si ce n'est pas le cas, je veux faire clignoter la fenêtre jusqu'à ce qu'ils se concentrent dessus.Comment savoir si une fenêtre est active? (Win32 API)

Alternativement, l'indicateur de structure FlashWindowEx FLASHW_TIMERNOFG qui clignote jusqu'à ce que la fenêtre ait le focus ne clignote pas si la fenêtre a déjà le focus? Je ne peux pas tester cela maintenant car je ne suis pas dans mon environnement de développement, mais j'avais l'impression que ça clignoterait de toute façon, ce que j'essaie d'éviter.

Editer: En outre, si c'est important, l'application utilise DirectX dans cette fenêtre.

+0

Voulez-vous demander: «cette fenêtre a-t-elle le focus» ou «est-ce que l'une des fenêtres de cette application a le focus»? – ChrisW

+0

J'ai noté dans un commentaire ci-dessous que cette application aura seulement une fenêtre. –

Répondre

23

GetActiveWindow renverra la fenêtre de niveau supérieur associée au focus d'entrée. GetFocus retournera le handle de la fenêtre qui a le focus d'entrée.

Cet article pourrait aider:
http://www.microsoft.com/msj/0397/Win32/Win320397.aspx

+0

Cet utilitaire est génial! –

+0

Le lien n'est plus disponible à l'emplacement indiqué, mais est disponible en tant qu'archive: [web.archive.org/web/200308](https://web.archive.org/web/20030807084141/http://www.web.org microsoft.com/msj/0397/Win32/Win320397.aspx) – Sabuncu

7

Voulez-vous vraiment dire "focus" ou voulez-vous dire "actif?"

Une fenêtre a le focus - celle qui est la première en ligne pour obtenir des événements de clavier. La fenêtre externe (que l'utilisateur peut faire glisser sur l'écran) est "active" si l'un de ses sous-fenêtres a le focus, mais il peut ou non avoir le focus lui-même.

+1

L'application n'aura jamais qu'une seule fenêtre, aucune sous-fenêtre Windows ou enfant. –

13

Outre gkrogers réponse à l'aide GetActiveWindow, vous pouvez également maintenir une variable booléenne pour la fenêtre que vous voulez savoir si elle a le focus ou non en piégeant les WM_SETFOCUS et WM_KILLFOCUS événements, ou 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

Aimez l'exemple. – Xcalibur37

4

Utilisez la fonction GetForegroundWindow pour obtenir le Hwnd que vous focalisez en ce moment. Ensuite, vous avez juste besoin de le comparer à la fenêtre de votre application pour vérifier si elle contient le focus ou non.

Questions connexes