Question

A partir de l'API Win32 natif en C ++ est-il un moyen de déterminer si la fenêtre associée à un HWND est toujours valide?

Était-ce utile?

La solution

Vous pouvez utiliser l'API Win32 IsWindow .

Il est recommandé pour l'utiliser mais pour 2 raisons:

  1. poignées de Windows peuvent être réutilisés une fois que la fenêtre est détruite, de sorte que vous ne savez pas si vous avez une poignée à une fenêtre entièrement différente ou non.
  2. L'Etat pourrait changer directement après cet appel et vous pense qu'il est valable, mais il peut vraiment pas être valide.

De MSDN (même lien que ci-dessus):

  

Un fil ne doit pas utiliser IsWindow pour une   fenêtre qu'il n'a pas créé parce que   la fenêtre pourrait être détruite après   cette fonction a été appelée. Plus loin,   parce que les poignées de fenêtre sont recyclés   la poignée pourrait même pointer vers un   autre fenêtre.

Que peut-on faire?

Peut-être votre problème peut être ré-architecturé de telle sorte que vous n'avez pas besoin de vérifier une poignée valide. Peut-être par exemple, vous pouvez établir un tuyau à partir du client vers le serveur.

Vous pouvez aussi créer un crochet de fenêtres pour détecter certains messages se produisent, mais cela est probablement excessif pour la plupart des besoins.

Autres conseils

Cette question est vieux, mais je besoin de cette fonctionnalité et moi-même était un peu déçu après avoir lu les mises en garde. Cependant, après avoir fait un peu plus creuser, il semble que tout va bien. Sauf si vous avez affaire à des programmes de 16bit, IsWindow semble être le chemin à parcourir. Le problème de la réutilisation de la poignée semble avoir été suffisamment pris en compte selon ceci:

http://blogs.msdn.com/b/oldnewthing/archive /2007/07/17/3903614.aspx

Alors, à cause du compteur de réutilisation 16bit supérieure, il est très peu probable que vous rencontrez un problème de réutilisation de la fenêtre.

Vous pouvez utiliser IsWindow () ou aussi envoyer la fenêtre un message WM_NULL avec SendMessage (hWnd, WM_NULL) et voir si elle est réussie.

En outre, il est vrai que la fenêtre pourrait être détruite à tout moment si elle n'est pas sous votre contrôle. Comme d'autres ont déclaré la poignée pourrait appartenir à une autre fenêtre que les poignées sont réutilisées. En réalité, je ne sais pas comment cela est probable.

La seule solution que je connaisse le système pour créer un large qui recherche des messages indiquant une fenêtre est détruite (WM_CLOSE, WM_DESTROY). Ensuite, vous comparer la poignée de fenêtre de message à ceux que vous tenez pour voir si l'une des fenêtres que vous aimez sont touchés. Voir ici pour plus d'informations sur le système des crochets larges.

Si la procédure de fenêtre pour la fenêtre en question est sous votre contrôle (ou si vous pouvez sous-classer), alors je suggère l'enregistrement d'un message personnalisé que la fenêtre répond à un résultat non nul. L'envoi de ce message à une autre fenêtre (ou un HWND valide) se traduira par 0.

Bien sûr, cela ne vous indique si le HWND fait référence à l'une des fenêtres que vous contrôlez -. Mais peut-être donné d'autres réponses ci-dessus qui pourraient même être avantageux

Utilisez RegisterWindowMessage pour enregistrer le message, en utilisant un nom suffisamment unique.

Peut-être une combinaison de IsWindow, FindWindow et GetWindowThreadProcessId sera plus précis

HWND windowHandle = FindWindow(NULL, TEXT("window_title"));
LPDWORD oldpid = 0;
GetWindowThreadProcessId(windowHandle, &oldpid);
//after some time
if (IsWindow(windowHandle))
{
    LPDWORD newpid = 0;
    GetWindowThreadProcessId(windowHandle, &newpid);
    if (newpid == oldpid)
    {
        //the window is still running
    }else
    {
        //the window exists but has changed
    }
}
if(IsWindow(FindWindow(NULL , TEXT("Example Window Name")))){
     // do stuff
 }

va vérifier si la fenêtre existe et a le nom approprié

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top