Wie kann ich bestimmen, wenn ein Fenster außerhalb des Bildschirms?
In Windows XP und höher, in einem gegebenen Fenster-handle (HWND), wie kann ich feststellen, ob die Fenster position und Größe, das Fenster bleibt unwiederbringlich vom Bildschirm? Zum Beispiel, wenn der Titelleiste steht der cursor, dann die Fenster gezogen werden können, zurück auf dem Bildschirm. Ich müssen zu entdecken, wenn das Fenster ist in der Tat sichtbar oder zumindest für den Benutzer verfügbar. Ich denke, ich muss auch wissen, wie zu erkennen und darauf zu reagieren, um die änderung der Auflösung und der Umgang mit mehreren Monitoren. Dies scheint wie eine ziemlich große Sache. Ich bin mit C++ und der regelmäßigen SDK, also bitte beschränken Sie Ihre Antworten auf dieser Plattform eher als Berufung auf C# oder ähnliches.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Windows macht es relativ einfach bestimmen die Größe des Benutzers Arbeitsbereich auf dem primären monitor (d.h., der Bereich des Bildschirms nicht verdeckt durch die Taskleiste). Rufen Sie die
SystemParametersInfo
Funktion und geben Sie dieSPI_GETWORKAREA
- flag für den ersten parameter (uiAction
). DiepvParam
parameter sollte auf einenRECT
- Struktur, dass erhalten die Koordinaten des Arbeitsbereichs in der virtuellen Bildschirmkoordinaten.Sobald Sie haben die Koordinaten, beschreiben Sie den Arbeitsbereich, es ist einfach eine Frage der Vergleich dieser mit der aktuellen position Ihrer Anwendung Fenster, um festzustellen, ob er liegt innerhalb dieser Grenzen.
Der Wunsch, Unterstützung für mehrere Monitore macht die Dinge etwas komplizierter. Die Dokumentation für
SystemParametersInfo
deutet darauf hin, dass Sie aufrufen müssen, dieGetMonitorInfo
- Funktion statt um den Arbeitsbereich von einem anderen monitor als dem primären. Es füllt eine Struktur namensMONITORINFOEX
enthält, der MitgliedrcWork
definiert den Arbeitsbereich der monitor, wieder ausgedrückt in der virtuellen Bildschirmkoordinaten alsRECT
Struktur.Zu tun, dieses Recht, werden Sie brauchen, um alle aufzuzählen, der überwacht ein Benutzer mit dem system verbunden ist und zum abrufen der Arbeitsbereich des einzelnen mit
GetMonitorInfo
.Gibt es ein paar Proben von dies finden Sie rund um das Internet:
Schließlich erwähnten Sie wollen erkennen, die änderung der Auflösung. Dies ist viel einfacher als Sie wahrscheinlich gedacht. Wie Sie wissen, wenn Sie getan haben jede Windows-Programmierung, der primäre Weg, dass das Betriebssystem kommuniziert mit der Anwendung, wird durch das senden von Nachrichten an Ihre
WindowProc
- Funktion.In diesem Fall, werden Sie wollen, um Uhr für die
WM_DISPLAYCHANGE
Nachricht, die an alle Fenster, wenn die display-Auflösung hat sich geändert. DiewParam
enthält das neue Bild Farbtiefe in bits pro pixel; das niederwertige Wort deslParam
gibt die horizontale Auflösung und das hohe word der derlParam
gibt die vertikale Auflösung des Bildschirms an.GetSystemMetrics
Funktion. Um die Höhe der Titelleiste eines Fensters in Pixel angebenSM_CYCAPTION
für dienIndex
parameter. Um die Breite eines Fensters Rand in Pixel angebenSM_CXBORDER
, und für die Höhe eines Fensters Rand in Pixel angebenSM_CYBORDER
.Können Sie MonitorFromRect oder MonitorFromPoint um zu überprüfen, ob Fenster oben Links oder unten rechts Punkt ist nicht enthalten innerhalb jeder monitor (Bildschirm ausschalten).
Sicht-Prüfung ist wirklich einfach.
Brauchen Sie nicht zu verwenden, RectInRegion, die ich für kürzen-code.
Anzeige, Auflösung ändern, die überwachung ist auch einfach, wenn Sie mit WM_SETTINGCHANGE-Nachricht.
http://msdn.microsoft.com/en-us/library/ms725497(v=vs. 85).aspx
UPDATE
Wie @Cody Grau angegeben, ich denke WM_DISPLAYCHANGE ist besser geeignet als WM_SETTINGCHANGE. Aber MFC 9.0 Bibliothek nutzen WM_SETTINGCHANGE.