AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Graphik eines anderen Windows Fensters capturen
Thema durchsuchen
Ansicht
Themen-Optionen

Graphik eines anderen Windows Fensters capturen

Ein Thema von Gutelo · begonnen am 30. Apr 2014 · letzter Beitrag vom 30. Apr 2014
Antwort Antwort
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#1

Graphik eines anderen Windows Fensters capturen

  Alt 30. Apr 2014, 06:07
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

Geändert von Gutelo (30. Apr 2014 um 06:38 Uhr)
  Mit Zitat antworten Zitat
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#2

AW: Graphik eines anderen Windows Fensters capturen

  Alt 30. Apr 2014, 06:56
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#3

AW: Graphik eines anderen Windows Fensters capturen

  Alt 30. Apr 2014, 07:49
Wieso ist das so?
Weil EnumWindowsProc eine Prozedur ist und keine Methode. (maximal kann man das als eine statische Klassen-Methode deklarieren class procedure ...; static; )
Siehe Hilfe.

Beim FindAWindow ist das natürlich egal.

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 ... * SizeOf(Char) die Größe beim GetMem richtig anpassen.

Ach ja, die Größenangabe beim FreeMem ist und war ebenfalls schon immer total falsch.
Entweder richtig, oder am Einfachten garnicht angeben ... also einfach eine 0 .
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (30. Apr 2014 um 07:53 Uhr)
  Mit Zitat antworten Zitat
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#4

AW: Graphik eines anderen Windows Fensters capturen

  Alt 30. Apr 2014, 08:19
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?
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Graphik eines anderen Windows Fensters capturen

  Alt 30. Apr 2014, 08:51
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
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:11 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