Frage

Von der nativen Win32-API unter Verwendung von C ++ ist es eine Möglichkeit, um zu bestimmen, ob das Fenster mit einem HWND assoziiert noch gültig ist?

War es hilfreich?

Lösung

Sie können verwenden die Win32-API IsWindow .

Es wird nicht empfohlen , es zu benutzen, obwohl aus 2 Gründen:

  1. Windows-Handles können wiederverwendet werden, sobald das Fenster zerstört wird, so dass Sie nicht wissen, ob Sie mit einem Griff zu einem ganz anderen Fenstern haben oder nicht.
  2. Der Staat könnte direkt nach diesem Aufruf ändern, und Sie werden denken, dass es gültig ist, aber es kann wirklich nicht gültig sein.

Von MSDN (gleiche Verbindung wie oben):

  

Ein Thread sollte nicht für eine Verwendung IsWindow   Fenster, dass es nicht erstellt haben, weil   das Fenster kann nach zerstört werden   diese Funktion aufgerufen wurde. Des Weiteren,   weil Fenstergriffe werden recycelt   der Griff könnte sogar zu einem Punkt   verschiedene Fenster.

Was kann getan werden?

Vielleicht ist Ihr Problem kann neu gestaltet werden, so dass Sie die Notwendigkeit, nicht über einen gültigen Handle zu überprüfen. Vielleicht können Sie zum Beispiel ein Rohr vom Client zum Server aufbauen.

Sie können auch ein Fenster Haken zu erfassen, erzeugen, wenn bestimmte Nachrichten auftreten, aber das ist wahrscheinlich übertrieben für die meisten Bedürfnisse.

Andere Tipps

Diese Frage ist alt, aber ich brauchte diese Funktionalität selbst und war ein wenig enttäuscht, nachdem über die Einsprüche zu lesen. Doch nach ein bisschen mehr tun, graben es scheint, dass alles gut ist. Es sei denn, Sie sind den Umgang mit 16-Bit-Programme, erscheint IsWindow der Weg zu sein, um zu gehen. Das Problem der Griff Weiterverwendung erscheint ausreichend nach adressiert gewesen zu sein, um diese:

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

Also, weil die oberen 16bit Wiederverwendung Zähler, ist es höchst unwahrscheinlich, dass Sie in ein Fenster Wiederverwendung Problem ausgeführt werden.

Sie können mit IsWindow () oder auch versuchen, das Fenster ein WM_NULL Nachricht senden mit Sendmessage (hWnd, WM_NULL) und sehen, ob es erfolgreich ist.

Es ist auch wahr, dass die Fenster jederzeit zerstört werden könnten, wenn es nicht unter Kontrolle ist. Wie andere der Griff gesagt haben könnte möglicherweise zu einem anderen Fenster gehört wie die Griffe wieder verwendet werden. In Wirklichkeit weiß ich nicht, wie wahrscheinlich das ist.

Die einzige Lösung, dass ich von dem weiß eine systemweite Haken erstellen das sieht für Nachrichten ein Fenster anzeigt, wird zerstört (WM_CLOSE, WM_DESTROY). Dann würden Sie das Meldungsfenster Griff diejenigen vergleichen Sie halten, um zu sehen, ob einer der Fenster, die Sie interessieren betroffen sind. Sehen Sie hier für weitere Informationen über systemweite Haken.

Wenn die Fensterprozedur für das Fenster in Frage unter Kontrolle ist (oder, wenn Sie es Unterklasse können), dann würde ich vorschlagen, eine benutzerdefinierte Nachricht, dass die Fenster reagieren auf mit einem Nicht-Null-Ergebnis Registrierung. die Nachricht in einem anderen Fenster gesendet (oder eine ungültige HWND) in 0 zur Folge hat.

Natürlich, das sagt Ihnen, nur wenn die HWND bezieht sich auf eines der Fenster, die Sie steuern -. Aber vielleicht gegeben andere Antworten darüber sogar vorteilhaft sein könnte

Verwenden RegisterWindowMessage die Nachricht zu registrieren, um einen hinreichend eindeutigen Namen verwendet wird.

Vielleicht eine Kombination aus IsWindow, FindWindow und GetWindowThreadProcessId wird genauer

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
 }

prüft, ob das Fenster vorhanden ist und den entsprechenden Namen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top