AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Unsichtbares Zeichnen eines Fensters anhand eines Handles

Unsichtbares Zeichnen eines Fensters anhand eines Handles

Ein Thema von CWBudde · begonnen am 8. Jan 2011 · letzter Beitrag vom 8. Jan 2011
Antwort Antwort
Benutzerbild von CWBudde
CWBudde

Registriert seit: 21. Apr 2006
Ort: Hannover
12 Beiträge
 
Delphi XE2 Professional
 
#1

Unsichtbares Zeichnen eines Fensters anhand eines Handles

  Alt 8. Jan 2011, 12:53
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
Christian
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Unsichtbares Zeichnen eines Fensters anhand eines Handles

  Alt 8. Jan 2011, 13:28
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.
Michael
Ein Teil meines Codes würde euch verunsichern.

Geändert von Luckie ( 8. Jan 2011 um 13:31 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: Unsichtbares Zeichnen eines Fensters anhand eines Handles

  Alt 8. Jan 2011, 16:16
vielleicht hilft Dir das
http://www.delphipraxis.net/118294-s...-erzeugen.html

Du kannst das Fenster ja -10000 Positionieren
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von CWBudde
CWBudde

Registriert seit: 21. Apr 2006
Ort: Hannover
12 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Unsichtbares Zeichnen eines Fensters anhand eines Handles

  Alt 8. Jan 2011, 17:39
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).


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
Christian
  Mit Zitat antworten Zitat
Benutzerbild von CWBudde
CWBudde

Registriert seit: 21. Apr 2006
Ort: Hannover
12 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Unsichtbares Zeichnen eines Fensters anhand eines Handles

  Alt 8. Jan 2011, 17:39
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
Christian
  Mit Zitat antworten Zitat
Benutzerbild von CWBudde
CWBudde

Registriert seit: 21. Apr 2006
Ort: Hannover
12 Beiträge
 
Delphi XE2 Professional
 
#6

AW: Unsichtbares Zeichnen eines Fensters anhand eines Handles

  Alt 8. Jan 2011, 17:42
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]
Christian

Geändert von CWBudde ( 8. Jan 2011 um 18:00 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:22 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