![]() |
Herausfinden, ob Fenster sichtbar ist
Servus :hi:
Ich hab da mal ne Frage: Gibt es eine Möglichkeit herauszufinden, ob ein Fenster bzw. ob ein Teil eines Fensters überhaupt sichtbar ist oder ob das Fenster komplett von einem anderen Fenster (nicht auf ein Programm beschrenkt) verdeckt wird? Ich suche nicht die Funktion IsWindowVisible. Hintergrund: Für meine ![]() Grüße Dave |
Re: Herausfinden, ob Fenster sichtbar ist
Hallo, dafür eignet sich die GetClipBox API.
Delphi-Quellcode:
type
TVisibleStatus = (vsHidden, vsVisible, vsPartVisible); function TForm1.GetVisibleStatus(wnd: HWND): TVisibleStatus; var Clip: Integer; hDC: THandle; ClipRect, ClientRect: TRect; begin hDC := GetDC(wnd); Clip := GetClipBox(hDC, ClipRect); case Clip of NULLREGION: Result := vsHidden; // Fenster ist komplett versteckt SIMPLEREGION: begin ClientRect := GetClientRect; if EqualRect(ClipRect, ClientRect) then // vollständig sichtbar Result := vsVisible //ClientRect ist sichtbar else //teils sichtbar Result := vsPartVisible; //ClientRect ist sichtbar end; COMPLEXREGION: // Region besteht aus mehr als einem Rechteck, Fenster ist teils sichtbar Result := vsPartVisible; end; ReleaseDC(Handle, hDC); end; |
Re: Herausfinden, ob Fenster sichtbar ist
Danke für den Code - der Funktioniert an sich sehr gut, nur leider nicht bei meinem Problem :-(.
Meine Fenster sind vom Style her WS_EX_LAYERED. Ich hab nach GetClipRgn + WS_EX_LAYERED gesucht und hab in einem C++Forum gefunden, dass diese Kombination nicht funktioniert - schade. Hast du sonst noch ne Idee, wie ich das hinkriegen könnte? |
AW: Herausfinden, ob Fenster sichtbar ist
:hi: Ich benutze diese Funktion schon seit längerer Zeit und habe sie heute aus der Hauptform raus in eine neue Unit umgezogen. Leider funktioniert die Funktion dann nicht mehr, da eine Windows-Funktion statt der Funktion in Forms.pas verwendet wird:
Delphi-Quellcode:
Ein Forms.GetClientRect; oder Forms.TCustomForm.GetClientRect; funktioniert leider nicht. Was muss man hier schreiben, damit die Forms.pas-Funktion verwendet wird?
ClientRect := GetClientRect;
|
AW: Herausfinden, ob Fenster sichtbar ist
Das war schon richtig: Nur der vollständige Name der Unit aus welcher du das nehmen möchtest ist
Delphi-Quellcode:
, nicht
Vcl.Forms
Delphi-Quellcode:
. Es würde dementsprechend heißen
Forms
Delphi-Quellcode:
.
Vcl.Forms.TCustomForm.GetClientRect()
Konjunktiv, da
Delphi-Quellcode:
an eine
GetClientRect()
Delphi-Quellcode:
-Instanz gebunden ist und keine statische Methode ist die man einfach so aufrufen kann: Du brauchst eine Form dafür, also z.B.
TCustomForm
Delphi-Quellcode:
Das
meinRect := meineForm.GetClientRect()
Delphi-Quellcode:
wirst du deiner Methode ja irgendwie übergeben, oder?
meineForm
Kannst du vlt. die Unit mit der Methode wie du es momentan hast posten? |
AW: Herausfinden, ob Fenster sichtbar ist
Du rufst ja die Methode einer TCustomForm-Instanz auf, also musst Du auch diese Instanz mit angeben.
Delphi-Quellcode:
ClientRect := FormInstanz.GetClientRect;
|
AW: Herausfinden, ob Fenster sichtbar ist
Meine aktuelle Funktion sieht momentan so aus. Ich habe nur die markierte Stelle geändert aber leider habe ich keinen Zugriff auf GetClientRect.
Delphi-Quellcode:
Die letzte Zeile verstehe ich auch nicht. Müsste da nicht eigentlich PForm.Handle stehen und nicht Handle?
function GetVisibleStatus(const PForm: TForm): TVisibleStatus;
var Clip: Integer; hDC: THandle; ClipRect, ClientRect: TRect; begin hDC := GetDC(PForm.Handle); Clip := GetClipBox(hDC, ClipRect); case Clip of NULLREGION: Result := vsHidden; // Fenster ist komplett versteckt SIMPLEREGION: begin ClientRect := PForm.GetClientRect; // nur das hier habe ich geändert if EqualRect(ClipRect, ClientRect) then // vollständig sichtbar Result := vsVisible // ClientRect ist sichtbar else // teils sichtbar Result := vsPartVisible; // ClientRect ist sichtbar end; COMPLEXREGION: // Region besteht aus mehr als einem Rechteck, Fenster ist teils sichtbar Result := vsPartVisible; end; ReleaseDC(Handle, hDC); end; |
AW: Herausfinden, ob Fenster sichtbar ist
Wie ist es so (ungetestet)?
Delphi-Quellcode:
function GetVisibleStatus(const PForm: TForm): TVisibleStatus;
var Clip: Integer; hDC: THandle; ClipRect, ClientRect: TRect; begin Assert(Assigned(PForm), 'Keine TCustomForm-Instanz übergeben'); hDC := GetDC(PForm.Handle); if hDC <> 0 then try Clip := GetClipBox(hDC, ClipRect); case Clip of NULLREGION: Result := vsHidden; // Fenster ist komplett versteckt SIMPLEREGION: begin ClientRect := PForm.ClientRect; // Property statt protected Getter if EqualRect(ClipRect, ClientRect) then // vollständig sichtbar Result := vsVisible // ClientRect ist sichtbar else // teils sichtbar Result := vsPartVisible; // ClientRect ist sichtbar end; COMPLEXREGION: // Region besteht aus mehr als einem Rechteck, Fenster ist teils sichtbar Result := vsPartVisible; end; finally ReleaseDC(PForm.Handle, hDC); end; end; |
AW: Herausfinden, ob Fenster sichtbar ist
Das funktioniert jetzt glücklicherweise. Zwar nicht mit dem Hauptformular, aber da brauche ich die Funktion eh nicht.
Ist ein Fenster komplett sichtbar, kommt trotzdem vsPart zurück. Ich rufe die Funktion eine Hand voll mal auf und vergleiche immer auf <> TVisibleStatus.vsHidden. Von daher ist es egal, ob vsVisible oder vsPart. |
AW: Herausfinden, ob Fenster sichtbar ist
Schöne Sache, habe ich mir mal beiseite gelegt, kann ich bestimmt mal brauchen.
Die Frage sollte allerdings mal als "erledigt" gekennzeichnet werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz