Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Hintergrundwindow (hidden) kopieren und als BMP speichern (https://www.delphipraxis.net/90208-hintergrundwindow-hidden-kopieren-und-als-bmp-speichern.html)

Karle_01 13. Apr 2007 12:53


Hintergrundwindow (hidden) kopieren und als BMP speichern
 
Hallo,

ich hätte ein Problem und würde mich freuen, wenn mir jemand helfen kann.

Ich möchte in Delphi einen Code schreiben. Dieser Code soll ein Fenster (Window) welches keinen Focus besitzt (hinter einer Anwendung ist) kopieren und die Kopie als Bild speichern. Eine Art Screenshot von einem hidden Window... Kann mir jemand diesbezüglich weiterhelfen?

Vielen Dank im Voraus!

Gruß
Karle

patti 28. Jun 2007 17:04

Re: Hintergrundwindow (hidden) kopieren und als BMP speicher
 
Hab das Thema gerade durch die Suche gefunden, da ich selbst sowas machen möchte.
@Karle_01: Hast du es schon geschafft? Wenn nicht, weiß jemand anderes, wie man das hinbekommt?
Auf dieser Seite gibt es ein Programm, das sowas beispielsweise kann. Irgendwie wird es wohl gehen... ;-)

P@Tti

eDonkey 18. Dez 2011 00:43

AW: Hintergrundwindow (hidden) kopieren und als BMP speichern
 
Ich hab das selbe Problem, da ich keinen Doppelpost machen möchte wärme ich mal diesen doch recht alten Threat auf. ich habe diverse funktionen dazu gefunden aber keine hatt funktioniert.
Hat noch nie jemand sowas gemacht?

Namenloser 18. Dez 2011 03:21

AW: Hintergrundwindow (hidden) kopieren und als BMP speichern
 
Mit WM_PRINT sollte das gehen. Allerdings hatte das afair den Haken, dass manche Controls nicht richtig gezeichnet werden oder sowas...

eDonkey 18. Dez 2011 06:21

AW: Hintergrundwindow (hidden) kopieren und als BMP speichern
 
Danke für die Antwort, ich habe das mal in die funktion eingebaut, die mit nicht versteckten fenstern bei mir super klappt:

Delphi-Quellcode:
function ScreenshotHidden(wnd: HWND; const bmp: TBitmap): Boolean;
var
   PrintWindow: function(sHandle: HWND; dHandle: HDC; nFlags: UINT): BOOL; stdcall;
   rec: TRect;
begin
   Result := False;
   if dllh <> 0 then
   begin
     @PrintWindow:= GetProcAddress(dllh , 'PrintWindow');
     if @PrintWindow <> nil then
     begin
       SendMessage(wnd, WM_PRINT, 0, 0);
       GetWindowRect(wnd, rec); //has to stay dynamic
       bmp.Width := rec.Right - rec.Left;
       bmp.Height := rec.Bottom - rec.Top;
       result := PrintWindow(wnd, bmp.Canvas.Handle, 0);
     end;
   end;
end;
sieht nun so aus geht aber noch nicht, das TImage bleibt leer sofern das fenster versteckt ist.

PS: die dll wird bei mir statisch im OnCreate event der form geladen.

Bummi 18. Dez 2011 07:21

AW: Hintergrundwindow (hidden) kopieren und als BMP speichern
 
die korrekte Implementierung findest Du dort:
http://www.delphipraxis.net/127741-s...anwendung.html

verdeckte oder außerhalb des Screen angezeigte Fenster (z.B. left -2000) bekommst Du so, versteckte im Sinne von hide nicht.

eDonkey 18. Dez 2011 09:44

AW: Hintergrundwindow (hidden) kopieren und als BMP speichern
 
Danke für den Link aber die funktion in dem threat ist ja gleich wie meine nur eben wird die dll dynamisch geladen.

Der Helfer in dem Threat verweist ja auf einen threat bei dem eine dll in einen spieleprozess injected wird, muss ich zwangsweise eine dll injecten um an mein hidden window bitmap zu kommen? Wenn ja, mit was könnte ich soetwas realisieren? die person im threat hatt den source leider nicht veröffentlicht.

Ich hab auch gelesen dass es eine möglichkeit gibt dem versteckten Fenster zu sagen es soll sich anstatt auf den desktop in meinen TImage bereich zeichnen, weiss vielleicht jemand was dazu?

Bummi 18. Dez 2011 13:46

AW: Hintergrundwindow (hidden) kopieren und als BMP speichern
 
Deine ist an einigen Stellen verdreht und das Locking fehlt (ok, brauchst Du ohne Threads nicht).
AFAIK wäre das einzige was Dir bleibt des Fenster z.B. nach -2000 zu verschieben, anzuzeigen, zu verbergen und die Position zurückzusetzen.

Progman 18. Dez 2011 15:10

AW: Hintergrundwindow (hidden) kopieren und als BMP speichern
 
Mal ein Hinweis dazu: TForm hat die Function GetFormImage, diese liefert ein Bitmap zurück, welches dann durch SaveToFile gespeichert werden kann.
Delphi-Quellcode:
...
var
  tmpBitmap: TBitmap;

  ...
  tmpBitmap:=myForm.GetFormImage;
  tmpBitMap.SaveToFile('test.bmp')
  ...
  tmpBitmap.Free;
In meinem Delphi 2007 klappt das auch mit nicht sichtbaren Forms.

eDonkey 18. Dez 2011 23:21

AW: Hintergrundwindow (hidden) kopieren und als BMP speichern
 
Zitat:

Zitat von Progman (Beitrag 1142014)
Mal ein Hinweis dazu: TForm hat die Function GetFormImage, diese liefert ein Bitmap zurück, welches dann durch SaveToFile...
...In meinem Delphi 2007 klappt das auch mit nicht sichtbaren Forms.

Es handelt sich bei dem Fenster um ein fremdes Fenster, keine eigene Form

Zitat:

Zitat von Bummi (Beitrag 1142007)
Deine ist an einigen Stellen verdreht und das Locking fehlt (ok, brauchst Du ohne Threads nicht).
AFAIK wäre das einzige was Dir bleibt des Fenster z.B. nach -2000 zu verschieben, anzuzeigen, zu verbergen und die Position zurückzusetzen.

Genau so hab ich es momentan gelöst, mich stöhrt aber daran dass die programme immernoch in der taskleiste angezeigt werden. gibt es eine möglichkeit diese dort auszublenden?


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:19 Uhr.
Seite 1 von 2  1 2      

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