2013-06-06 13 views
6

Ist es für die WS_CHILD Bit zu überprüfen:Was ist der beste Weg zu bestimmen, ob ein HWND ein Top-Level-Fenster darstellt?

LONG style = GetWindowLong(hwnd, GWL_STYLE); 
    int isTopLevel = !(style & WS_CHILD); 

Oder gibt es einen besseren Weg?

Angenommen: Straight C, das nur vorhandenen Windows-API-Code aufruft.

+0

Prüfung auf das Fehlen des 'WS_CHILD' Stil ist der Weg zu mach es - jedes Fenster, das kein Kind ist, ist ein Fenster der obersten Ebene. –

+0

@ Jonathan - jedoch gibt es Top-Level mit WS_CHILD (Kind von DesktopWindow) – kero

+0

Alle Fenster sind Kinder des Desktops in der Fensterhierarchie, aber nur diejenigen mit 'WS_CHILD' Set sind eigentlich untergeordnete Fenster. –

Antwort

6
  • Way # 1: Test hWnd==GetAncestor(hWnd,GA_ROOT)

  • Way # 2: Verwenden Sie IsTopLevelWindow (user32 Win7, ohne Papiere)

1

Die GetParent() API gibt den übergeordneten oder den Besitzer des aktuellen Fensters zurück.

+1

Die erste Zeile des Dokuments, mit dem ich verlinkt bin, lautet "Ruft ein Handle für den übergeordneten oder Eigentümer des angegebenen Fensters ab". Und spricht darüber, das Besitzerfenster später in dem Artikel abzurufen. – jwismar

+0

@chris: Die Dokumentation sagt: "Wenn das Fenster ein untergeordnetes Fenster ist, ist der Rückgabewert ein Handle für das übergeordnete Fenster. Wenn das Fenster ein Top-Level-Fenster mit dem WS_POPUP-Stil ist, ist der Rückgabewert ein Handle zu Besitzerfenster. " –

+0

@jwismar, ich bin heute blind. Ich habe alles über 'GetWindow' und' GetAncestor' gelesen und irgendwie den ersten Absatz übersehen. – chris

0

Ihre Methode ist möglich (Aber ich denke, Sie sollten besser prüfen, ob es auch ein überlappendes/Popup-Fenster ist). Es gibt vielleicht einen anderen Weg - Das heißt, alle Top-Level-Fenster aufzulösen und zu prüfen, ob Ihre Fenster im Ergebnis enthalten sind.

Verwandte Themen