Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Screenshots einzelner Fenster (https://www.delphipraxis.net/103740-screenshots-einzelner-fenster.html)

Motzi 21. Nov 2007 01:44


Screenshots einzelner Fenster
 
Hallo,

ich muss Screenshots einiger Fenster von bestimmten Prozessen machen - ansich kein Problem, ABER: die Fenster können minimiert oder irgendwo im Hintergrund (durch andere Fenster verdeckt) sein. Ich kann sie natürlich "restoren" und in den Vordergrund holen, jedoch handelt es sich dabei um sehr komplexe Applikationen die unter Umständen recht lange brauchen, bis der Fensterinhalt wieder vollständig neu gezeichnet ist. Wenn ich den Screenshot zu früh mache kommt als nur Mist dabei raus.

Daher meine Frage - gibt es irgendwelche APIs/Messages die ein Fenster dazu veranlassen sich neu zu zeichnen und erst zurückkehren, wenn das Fenster damit fertig ist? Ich hab bis jetzt leider nichts gefunden....

LG, Manuel

mkinzler 21. Nov 2007 05:35

Re: Screenshots einzelner Fenster
 
Brauchst du einen Scrennshoot oder willst du nur das Fenster ausdrucken?

hoika 21. Nov 2007 06:22

Re: Screenshots einzelner Fenster
 
Hallo,

du kannst das per InvalidateRect oder SendMessage (WM_PAINT) machen,
aber Windows ist so intelligent, dass es keine versteckten Fenster
zum Neuzeichnen veranlasst.
Ausserdem würde ich das als Programmierer der App ebenfalls
abfragen, warum Neuzeichnen, wenn ich versteckt bin ?

Drittes Problem. WM_PAINT ist Nachricht mit niedriger Priorität.

Meine Lösung deshalb: Vergess das ganze.


Heiko

bitsetter 21. Nov 2007 06:43

Re: Screenshots einzelner Fenster
 
Zitat:

Zitat von hoika
Ausserdem würde ich das als Programmierer der App ebenfalls
abfragen, warum Neuzeichnen, wenn ich versteckt bin ?

Hallo,

man könnte dann noch versuchen mit
Delphi-Quellcode:
windows.SetForegroundWindow()
das Fenster nach vorne zu holen und dann in einer Schleife solange darauf warten.
Delphi-Quellcode:
while windows.GetForegroundWindow <> ... do
Zitat:

Zitat von Motzi
Daher meine Frage - gibt es irgendwelche APIs/Messages die ein Fenster dazu veranlassen sich neu zu zeichnen und erst zurückkehren, wenn das Fenster damit fertig ist? Ich hab bis jetzt leider nichts gefunden....

Hast du es schon mal mit windows.RedrawWindow() versucht und Result ausgewertet?

Motzi 21. Nov 2007 10:00

Re: Screenshots einzelner Fenster
 
Hallo, erstmal danke für die Antworten!

@mkinzler: ich brauch einfach den Inhalt des Fensters - es muss nicht unbedingt ein Screenshot sein, aber was gibt es für Alternativen? WM_PRINT/WM_PRINTCLIENT sind AFAIK keine wirklichen Alternativen, da die jeweilige Anwendung diese Nachrichten explizit unterstützen muss - zumindest laut PSDK:
Zitat:

Zitat von PSDK
To force a window to draw into a specific device context, use the WM_PRINT or WM_PRINTCLIENT message. Note that this requires the target window to support the WM_PRINTCLIENT message.

@hoika, bitsetter: ich hab schon diverses mit InvalidateRect, UpdateWindow und RedrawWindow versucht. Das Fenster wird zuvor mit ForceForegroundWindow in den Vordergrund geholt - GetForegroundWindow liefert auch das besagte Fenster zurück, es ist also bereits im Vordergrund, aber noch nicht komplett neu gezeichnet. Eine WM_PAINT Message per SendMessage zu verschicken hab ich auch schon überlegt, das SDK schreibt jedoch:
Zitat:

Zitat von PSDK
The WM_PAINT message is generated by the system and should not be sent by an application.

LG, Manuel

mkinzler 21. Nov 2007 10:11

Re: Screenshots einzelner Fenster
 
Handelt es sich um ein Programm von dir?

Motzi 21. Nov 2007 10:16

Re: Screenshots einzelner Fenster
 
Nein, genau das ist das Problem.. es handelt sich um verschiedene Programme anderer Hersteller.

DGL-luke 21. Nov 2007 10:31

Re: Screenshots einzelner Fenster
 
Zitat:

Zitat von Motzi
@mkinzler: ich brauch einfach den Inhalt des Fensters - es muss nicht unbedingt ein Screenshot sein, aber was gibt es für Alternativen? WM_PRINT/WM_PRINTCLIENT sind AFAIK keine wirklichen Alternativen, da die jeweilige Anwendung diese Nachrichten explizit unterstützen muss - zumindest laut PSDK:

Hast dus schon versucht? Ich nehm fast an, dass die Standard-Windowcontrols das implementiert haben.

Motzi 21. Nov 2007 10:38

Re: Screenshots einzelner Fenster
 
Nein, versucht hab ich es noch nicht, werd ich aber vielleicht noch. Ich hab aber keine großen Hoffnungen, da die Anwendung große Netzpläne grafisch darstellt etc. und genau darum geht es - also nicht einfach nur um normale Standard-Steuerelemente.

mkinzler 21. Nov 2007 11:34

Re: Screenshots einzelner Fenster
 
Und das Programm hat keine Druckfunktion?


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:50 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz