2009-04-22 11 views
1

Ich versuche, ein Fenster zu erfassen. Ich überprüfe, dass ich das Vordergrundfenster mit GetForegroundWindow() nehme, also sollte theoretisch nichts über dem Fenster gezeichnet werden.Erkennen von Windows Pop-Ups

Ich rufe dann GetDC (GetDesktop()) und kopieren Sie den Bereich des Bildschirms, der mein Fenster belegt, zu einer Bitmap.

Wenn ich stattdessen ich GetDC (myWindowHandle) rufen Sie nicht auf die Titelleiste oder Grenzen bekommen (oder bin ich hier etwas fehlt?)

Mein Problem ist, dass ich alle Menüs jetzt richtig greifen, die meine Anwendung öffnet aber ich greife auch Pop-ups (IM-Client & Tweetdeck), die über meine Anwendung gezogen werden.

Ich habe die Funktion AnyPopup() gefunden, die wahr zurückgibt, wenn es ein Popup gibt, sagt aber, dass dies für Rückwärtskompatibilität mit 16-Bit-Versionen von Windows ist und im Allgemeinen nicht sinnvoll ist. Gibt es eine einfache Möglichkeit, die Popups (und deren Position) zu erkennen, oder muss ich alle Fenster durchlaufen und alle ihre untergeordneten Fenster der Reihe nach aufzählen, um zu testen, ob sie sich auf meinem Vordergrundfenster befinden?

Antwort

0

GetForegroundWindow() gibt das Fenster zurück, das derzeit Benutzereingaben empfängt, es muss nicht unbedingt über allen anderen sein. Ein Fenster kann mit der Funktion SetWindowPos() so eingestellt werden, dass es "ganz oben" ist, was dazu führt, dass es sich über anderen Fenstern befindet, auch wenn es nicht den Fokus hat (ich denke, das ist, was Sie unter Popup-Fenster verstehen).

Sie könnten wahrscheinlich Ihr Fenster dazu zwingen, von diesen oben zu sein, indem Sie SetWindowPos() mit HWND_TOPMOST als zweiten Parameter aufrufen. Da das Fenster den Eingabefokus hat, sollte es oben auf allen obersten Fenstern liegen.

Wenn das Fenster kein eigenes Fenster ist, müssen Sie es nach dem Screen Grabing wieder in seinen ursprünglichen Zustand zurückversetzen. Um herauszufinden, ob das Fenster zu Beginn am höchsten war, rufen Sie GetWindowLongPtr (myWindowHandle, GWL_EXSTYLE) auf und prüfen Sie, ob der Stil WS_EX_TOPMOST festgelegt wurde.

1

Wenn Sie GetDC aufrufen, erhalten Sie den Domänencontroller für den Clientbereich. Um den DC für das gesamte Fenster (einschließlich der Titelleiste und des Rahmens des Nicht-Client-Bereichs) zu erhalten, verwenden Sie GetDCEx mit dem DCX_WINDOW-Flag.

Überprüfen Sie auch die PrintWindow Funktion, damit Sie einen Schnappschuss eines Fensters machen können, auch wenn es verdeckt oder teilweise außerhalb des Bildschirms ist - es ist nicht perfekt, aber es funktioniert ziemlich gut.

Verwandte Themen