Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Unsichtbares Zeichnen eines Fensters anhand eines Handles (https://www.delphipraxis.net/157334-unsichtbares-zeichnen-eines-fensters-anhand-eines-handles.html)

CWBudde 8. Jan 2011 11:53

Unsichtbares Zeichnen eines Fensters anhand eines Handles
 
Hallo zusammen,

ich habe folgendes Problem: Ich möchte gerne ein Fenster, das mir von einer externen (unbekannten) DLL in Form eines Handles (HWND) übergeben wurde auf ein TBitmap-Objekt zeichnen, OHNE das es am Bildschirm sichtbar wird.

Im Moment mache ich eine Art Screenshot-Ansatz: Fenster auf ein TForm-Objekt zuweisen, das Objekt sichtbar machen (anzeigen lassen) und dann davon einen Screenshot machen.

Da das ganze aber in einem Batch-Prozess laufen soll ist mir das aufflackern des Fensters auf Dauer zu nervig. Außerdem behindern Fenster, die always-on-top sind (z.B. Task-Manager) diesen Trick.

Meine bisherigen Versuche Nachrichten wie WM_Paint an das Handle zu schicken sind dabei fehlgeschlagen, aber ich weiß auch noch nicht so recht wie ich den device context so umbiegen muss, dass das Fenster in das Bitmap gezeichnet wird.

Da es eigentlich eine recht rudimentäre Aufgabe ist hoffe ich, dass einer von euch mir hier helfen kann. Ggf. kann ich auch den bisherigen Quelltext posten in der Hoffnung, das jemand den Fehler findet.

Gruß,

Christian

Luckie 8. Jan 2011 12:28

AW: Unsichtbares Zeichnen eines Fensters anhand eines Handles
 
Ich streiche mal den Nebensatz raus:
Zitat:

Ich möchte gerne ein Fenster, das mir von einer externen (unbekannten) DLL in Form eines Handles (HWND) übergeben wurde auf ein TBitmap-Objekt zeichnen, OHNE das es am Bildschirm sichtbar wird.
Der Satz ergibt keinen Sinn. Deswegen frage ich dich: Was willst du?

Und noch der Hinweis: Nicht sichtbare Fenster werden von Windows nicht gezeichnet.

Doch jetzt habe ich es. Du willst die Oberfläche eines nicht sichtbaren Fensters in ein Bitmap kopieren. Wie gesagt, nicht sichtbare Fenster werden nicht gezeichnet. Eventuell könnte man was mit WM_PRINT erreichen.

Bummi 8. Jan 2011 15:16

AW: Unsichtbares Zeichnen eines Fensters anhand eines Handles
 
vielleicht hilft Dir das
http://www.delphipraxis.net/118294-s...-erzeugen.html

Du kannst das Fenster ja -10000 Positionieren

CWBudde 8. Jan 2011 16:39

AW: Unsichtbares Zeichnen eines Fensters anhand eines Handles
 
Zitat:

Zitat von Luckie (Beitrag 1073220)
Der Satz ergibt keinen Sinn. Deswegen frage ich dich: Was willst du?

Und noch der Hinweis: Nicht sichtbare Fenster werden von Windows nicht gezeichnet.

Ich kann nochmal den kompletten Kontext erläutern. Also:

Es geht um ein (bzw. mehrere) Plugins, das unter anderem eine Oberfläche anbietet. Diese Oberfläche kann man durch Übergeben eines Fenster-Handles (HWND) in ein Fenster zeichnen lassen. Über die Interna der Plugins ist nichts weiter bekannt, da diese von Drittanbietern erstellt sein können. Mir würde es aber auch reichen, wenn die Lösung erstmal nur für meine Plugins (mit Delphi erstellt) funktioniert.

Wie gesagt, wenn man dem Plugin ein Fenster-Handle übergibt (z.B. eines TForm-Objektes), dann reagiert das Plugin über dieses Handle auf Botschaften und lässt sich somit steuern und eben auch zeichnen. Das alles hängt natürlich zum einen von der Host-Applikation, aber auch vom Framework (VCL) und dem Betriebssystem ab.

Derzeit lasse ich das Plugin auf eine Form zeichnen um davon direkt einen Screenshot zu machen. Wenn aber der Taskmanager darüber liegt (Always-On-Top) ist das ganze Käse.

Der Versuch das Fenster einfach in einen Bereich außerhalb des sichtbaren Bildschirms zu schieben führt genau zu dem, was hier bereits angesprochen wurde. In dem Fall ist das Fenster nämlich nicht mehr sichtbar und wird auch nicht gezeichnet. Bzw. wenn ich das Fenster nur zur Hälfte aus dem Bildschirm herausschiebe, dann wird es auch nur zu even dieser Hälfte gezeichnet.

Ich hatte daher gehofft eventuell eine bestimmte Botschaft an das Plugin (bzw. mit Bezug auf das Handle) absetzen zu können, das ein Neuzeichnen (auch außerhalb des Bildschirmes) erzwingt.

Da es mir nur um einen Screenshot geht hatte ich gehofft, dass es vielleicht sogar möglich sei, z.B. den WM_Paint-Befehl direkt mit einem Device-Context-Handle des TBitmap-Objektes absetzen zu können um das Plugin sich direkt in das Bitmap zeichnen zu lassen (derzeit verwende ich BitBlit um den Screenshot zu kopieren).


Zitat:

Zitat von Luckie (Beitrag 1073220)
Doch jetzt habe ich es. Du willst die Oberfläche eines nicht sichtbaren Fensters in ein Bitmap kopieren. Wie gesagt, nicht sichtbare Fenster werden nicht gezeichnet. Eventuell könnte man was mit WM_PRINT erreichen.

An WM_PRINT habe ich noch nicht gedacht. Ich muss mir mal die Dokumentation darüber durchlesen, bislang hatte ich nur mal bei WM_PAINT geschaut. Allerdings bin ich halt nicht so der WinAPI-Experte.

Trotzdem Danke für die schnelle Antwort,

Christian

CWBudde 8. Jan 2011 16:39

AW: Unsichtbares Zeichnen eines Fensters anhand eines Handles
 
Zitat:

Zitat von Bummi (Beitrag 1073264)
vielleicht hilft Dir das
http://www.delphipraxis.net/118294-s...-erzeugen.html

Du kannst das Fenster ja -10000 Positionieren

Ich werde das mal ausprobieren. Bislang fürte ein Positionieren außerhalb des Bildschirms leider dazu, das das Fenster nicht gezeichnet wurde :-(

CWBudde 8. Jan 2011 16:42

AW: Unsichtbares Zeichnen eines Fensters anhand eines Handles
 
Ich habe jetzt mal die Funktion aus dem anderen Thread verwendet. Dabeu habe ich zwar einen störenden Rand um mein Bitmap, aber immerhin kann ich das Fenster schon mal außerhalb des Bildschirmes schieben!

[EDIT: Den Rahmen um das Fenster habe ich jetzt immerhin auch wegbekommen, aber ich finde die Lösung - auch wenn die gut funktioniert - immer noch etwas hakelig. Aber das liegt wohl an Delphi, da es die Funktion PrintWindow scheinbar nicht bereitstellt]


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:25 Uhr.

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