Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Graphik eines anderen Windows Fensters capturen (https://www.delphipraxis.net/180200-graphik-eines-anderen-windows-fensters-capturen.html)

Gutelo 30. Apr 2014 06:07

Graphik eines anderen Windows Fensters capturen
 
Hallo,

wie bekomme ich den Handle eines Fensters welches zu einem anderen geoeffneten Programm gehoert und darueber dessen Graphikinhalt als Bitmap?

Gutelo

Edit: ich hab folgendes gefunden: http://www.delphi-treff.de/tipps/sys...dung-bekommen/
Allerdings haben sie vergessen den Typ der Varible EnumWindowsProc anzugeben. Der Source Code kompiliert aber liefert eine exception wenn ich EnumWindowsProc als integer definiere.

Edit2: ahhh, EnumWindowsProc ist eine function

Edit3: source liefert trotzdem eine Zugriffsverletzung

Gutelo 30. Apr 2014 06:56

AW: Graphik eines anderen Windows Fensters capturen
 
So, der Sourcecode aus der angegebenen Page funktioniert jetzt.

Ich hatte zunaechst die Funktionen als Methoden des Forms TForm1 implementiert. Aus irgendeinem Grund fuehrt dies zu einer Zugriffsverletzung. Nachdem ich die Funktionen keiner Klasse zugeordnet habe geht alles. Wieso ist das so?

himitsu 30. Apr 2014 07:49

AW: Graphik eines anderen Windows Fensters capturen
 
Zitat:

Zitat von Gutelo (Beitrag 1257468)
Wieso ist das so?

Weil EnumWindowsProc eine Prozedur ist und keine Methode. (maximal kann man das als eine statische Klassen-Methode deklarieren
Delphi-Quellcode:
class procedure ...; static;
)
Siehe Hilfe.

Beim FindAWindow ist das natürlich egal.

Zitat:

Zitat von Gutelo (Beitrag 1257463)
Allerdings haben sie vergessen den Typ der Varible EnumWindowsProc anzugeben.

Variable? Das ist doch die Callback-Funktion.

Aber das Boolean als Result von EnumWindowsProc ist definitiv falsch, denn das muß ein BOOL, bzw. LongBool sein.


Hast du mal nachgesehn wo MSDN-Library durchsuchenEnumWindows definiert ist?
Und schon weißt du, wo man die Hilfe/Informationen dazu findet.


PS: GetMem ... Bedenke daß der Code alt ist, wobei der Tipp noch nicht sooo alt ist, aber dennoch ist das ein ANSI-Coded, auch wenn er automatisch auf Unicode läuft,
aber wenn man bei MSDN-Library durchsuchenGetWindowText, MSDN-Library durchsuchenGetClassName mal in die Doku schaut, dann haben die Größenangaben gefälligst in "Characters" und nicht in Bytes angegeben zu werden.
Somit ist seit D2009 das GetMem zu klein ... unbedingt immer mit
Delphi-Quellcode:
... * SizeOf(Char)
die Größe beim GetMem richtig anpassen.

Ach ja, die Größenangabe beim FreeMem ist und war ebenfalls schon immer total falsch. :wall:
Entweder richtig, oder am Einfachten garnicht angeben ... also einfach eine
Delphi-Quellcode:
0
.

Gutelo 30. Apr 2014 08:19

AW: Graphik eines anderen Windows Fensters capturen
 
Danke fuer die Infos Himitsu,

sollte ich diese Version verwenden oder gibt es eine bessere Methode um auf fremde Windows zuzugreifen?

Hast du einen Tipp wie man mit dem Window Handle ein Capture des Inhalts bekommen kann?

Union 30. Apr 2014 08:51

AW: Graphik eines anderen Windows Fensters capturen
 
Also generell solltest Du so vorgehen:
  1. Ermitteln aller Threads des Zielprozesses über die Prozess-Id mit den ToolHelp-Funktionen (CreateToolHelp32SnapShot, Thread32First, Thread32Next)
  2. Ermitteln aller Fenster jedes Threads sowie deren Sichtbarkeit über EnumThreadWindows
  3. Den Devicecontext des Fensters holen, den Inhalt in ein Bitmap kopieren und den Context wieder freigeben. Alternativ kannst Du die Funktion PrintWindow verwenden, um sich das Fenster selber in das Bitmap-Canvas-Handle zeichnen zu lassen


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