![]() |
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 |
AW: Unsichtbares Zeichnen eines Fensters anhand eines Handles
Ich streiche mal den Nebensatz raus:
Zitat:
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. |
AW: Unsichtbares Zeichnen eines Fensters anhand eines Handles
vielleicht hilft Dir das
![]() Du kannst das Fenster ja -10000 Positionieren |
AW: Unsichtbares Zeichnen eines Fensters anhand eines Handles
Zitat:
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:
Trotzdem Danke für die schnelle Antwort, Christian |
AW: Unsichtbares Zeichnen eines Fensters anhand eines Handles
Zitat:
|
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 09:52 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