Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Problem: Screenshot von Fenstern (mal anders) (https://www.delphipraxis.net/74206-problem-screenshot-von-fenstern-mal-anders.html)

Hanzmeierschulz 30. Jul 2006 14:39


Problem: Screenshot von Fenstern (mal anders)
 
Hi,
ich habe folgendes vor. Mein Delphi-Programm soll von einem beliebigen Fenster-Handle (HWND) einen Screenshot machen. Hört sich erstmal einfach an, denn ich habe mit GetDC bzw. GetWindowDC den DeviceContext geholt und dann mit BitBlt in ein TBitmap kopiert. Das geht auch soweit, nur gibt es zwei Probleme: 1. Liegt das zu fotografierente Fenster nicht komplett oder garnicht auf den Desktop, also es ist z.B. ganz nach rechts verschoben, wird dieser Teil nicht mit kopiert, sonder nur der Teil der auf dem Desktop liegt. 2. Ist ein Fenster, z.B. durch OnTop, darüber, so wird das "obere" Fenster auch mit teilweise abfotografiert.
Somit ist mein Ziel das Fenster so zu fotografieren, dass egal wo das Fenster liegt oder ob ein anderes Fenster darüber liegen, komplett zu fotografieren. Ich hoffe es gibt da eine Lösung.

DGL-luke 30. Jul 2006 15:16

Re: Problem: Screenshot von Fenstern (mal anders)
 
Ich glaube, da gibt es eine Message - WM_FORCEPAINT oder so, die du an das Fenster schickst. Dann wird es komplett gezeichnet. Schau mal in entsprechende Sources z.B. bei den Schweizern oder in der CodeLib, das müsste irgendwo schon dabei stehen...

Hanzmeierschulz 30. Jul 2006 17:27

Re: Problem: Screenshot von Fenstern (mal anders)
 
Hab mal alles durchgeschaut, aber nicht richtiges gefunden.

Gibt es die Möglichkeit, denn Fenster zu sagen, dass es auf einen anderen Context als den Desktop sich zeichnet? So zu sagen das Fenster-Zeichnen umleiten.

Metal_Snake2 30. Jul 2006 17:31

Re: Problem: Screenshot von Fenstern (mal anders)
 
Ne also so einfach ist das nicht.
Selbst mit PrintWindow funzt es nicht ganz.

Die einzige möglichkeit ist hierfür ein Globaler Hook per dll-injection.

Luckie 30. Jul 2006 21:54

Re: Problem: Screenshot von Fenstern (mal anders)
 
Zitat:

Zitat von Hanzmeierschulz
nur gibt es zwei Probleme: 1. Liegt das zu fotografierente Fenster nicht komplett oder garnicht auf den Desktop, also es ist z.B. ganz nach rechts verschoben, wird dieser Teil nicht mit kopiert, sonder nur der Teil der auf dem Desktop liegt. 2. Ist ein Fenster, z.B. durch OnTop, darüber, so wird das "obere" Fenster auch mit teilweise abfotografiert.
Somit ist mein Ziel das Fenster so zu fotografieren, dass egal wo das Fenster liegt oder ob ein anderes Fenster darüber liegen, komplett zu fotografieren.

Logisch, weil diese Pixel von dem betroffenen Fenster gar nicht existieren in diesem Moment.

Hanzmeierschulz 31. Jul 2006 19:30

Re: Problem: Screenshot von Fenstern (mal anders)
 
Habs es zum Teil hinbekommen. Ich habe mir eine DLL geschrieben die sich an WndProc des Fensters "hookt". Dort wird dann durch eine eigene User-Message ein WM_PRINT ausgelösst und der Inhalt dann in ein TBitmap gespeichert. Leider wird nicht immer das komplette Fenster kopiert (anders als oben, hier fehlen Teile im Fenster). Das liegt daran, das in der OnPaint-Methode vom Fenster mit BeginPaint (EndPaint) ein neuer (anderer) Context erzeugt wird und somit nicht in mein TBitmap gelangt. Laut dieser Seite: http://www.fengyuan.com/article/wmprint.html muss dazu noch die BeginPaint und EndPaint Funktion umbiegen und durch eigene ersetzen. Das ist mir aber zu aufwendig, vielleicht kennt ja jemand noch eine andere Lösung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02: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