AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Screenshot eines anderen Programmes mit wm_print
Thema durchsuchen
Ansicht
Themen-Optionen

Screenshot eines anderen Programmes mit wm_print

Ein Thema von SirThornberry · begonnen am 8. Jun 2006 · letzter Beitrag vom 15. Feb 2009
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#1

Screenshot eines anderen Programmes mit wm_print

  Alt 8. Jun 2006, 10:09
Hallo,

ich versuche mit folgendem Quelltext ein Screenshot eines anderen Programmes zu machen. Leider bleibt mein Bild leer. Muss ich das Handle unbedingt im anderen Prozess erzeugen oder sorgt SendMessage dafür das dieses Handle im anderen Prozess gültigkeit erlangt (wie es bei wm_copydata dafür sorgt das die Daten im anderen Adressraum gültig sind)?
Delphi-Quellcode:
  GetWindowPlacement(lHandle, @lPlacement);
  lRect := lPlacement.rcNormalPosition;

  lBitmap := TBitmap.Create;
  lBitmap.Height := lRect.Bottom - lRect.Top + 1;
  lBitmap.Width := lRect.Right - lRect.Left + 1;
  SendMessage(lHandle, WM_PRINT, Integer(lBitmap.Canvas.Handle), PRF_ERASEBKGND or PRF_CLIENT or PRF_CHILDREN);
  lBitmap.SaveToFile('d:\ab1.bmp');
  lBitmap.Free;
[Edit]
Mit der Funktion PrintWindow funktioniert es. Mich würde jedoch trotzdem interessieren warum es so wie ich es versucht hab nicht funktioniert.
[/Edit]
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Vjay

Registriert seit: 2. Dez 2003
Ort: Berlin/Eschede
481 Beiträge
 
Delphi 7 Professional
 
#2

Re: Screenshot eines anderen Programmes mit wm_print

  Alt 8. Jun 2006, 14:40
Ja du musst in den anderen Prozess rüber.
Und selbst dann funktioniert es nicht immer, es gibt halt Controls die die WM_PRINT ignorieren.
Wer später bremst ist eher tot.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

Re: Screenshot eines anderen Programmes mit wm_print

  Alt 8. Jun 2006, 14:44
Reservier die Speicher im fremden prozess mit VirtualAllocEx, erstell dort dein Bitamp und dann kopierst du es dir mit ReadProcessMemory in eine identsiche Struktur in deinem Prozess. Siehe dazu auch meine LuckieDIPS.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Vjay

Registriert seit: 2. Dez 2003
Ort: Berlin/Eschede
481 Beiträge
 
Delphi 7 Professional
 
#4

Re: Screenshot eines anderen Programmes mit wm_print

  Alt 8. Jun 2006, 15:00
Ich habe das vor einiger Zeit mal mit DLL injection gelöst.
Ich hänge dir den Code mal an, aber Achtung: Das ganze ist alles andere als sauber programmiert! Das war so ein, "so lange basteln bis es funktioniert" - Ding.

An einer Lösung ohne DLL wäre ich aber auch jederzeit interessiert, nur wie erzeugt man ein Bitmap in einem anderen Prozess, ohne darin zu laufen?

PS. Aufruf für ein einzelnes Fenster:

function doSnapshot( const handle: integer; const usePaint, doEnumAfter: Boolean; const dllFilePath: string): TBitmap;

handle: logisch
usePaint: true = WM_PAINT / false = WM_PRINT
doEnumAfter: Wenn true enumchildwindows und nochmals WM_PAINT an diese senden
dllFilePath: Pfad zur DLL
result: NIL wenn Fehler, ansonsten das erstellte TBitmap

Die anderen Funktionen sind um Screenshots von ganzen Applikationen zu machen. Die Unit verwendet noch eine Mainfunc, die ich aber nicht includen werde, musst sie dir halt umbasteln wenn du sie verwenden willst.
Angehängte Dateien
Dateityp: zip remotesnapshot_670.zip (77,5 KB, 84x aufgerufen)
Wer später bremst ist eher tot.
  Mit Zitat antworten Zitat
seRiaLizA

Registriert seit: 19. Apr 2007
Ort: Aachen
5 Beiträge
 
Delphi 7 Professional
 
#5

Re: Screenshot eines anderen Programmes mit wm_print

  Alt 15. Mai 2007, 10:02
wenn ich dein

doSnapshot

aufrufe, enthällt das Image was zurückgegeben wird folgendes:

"Anwendung reagiert nicht."

OS: WinXP

Weiß jemand warum?
-----------------------------------------------------
...sagte der Einäugige unter den Blinden... )
-----------------------------------------------------
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#6

Re: Screenshot eines anderen Programmes mit wm_print

  Alt 14. Feb 2009, 18:46
Da ich einen Screenshot unter Win2000 brauche, hilft mir die Funktion "Printwindow" nicht weiter. Diese gibt es erst ab XP.
Nun habe ich versucht, mit LuckieDIPS mir was zusammenzubauen, aber die Windowsfunktionen sind nicht so mein Ding.
Ich habe mal meinen Versuch angehängt, aber er bringt nur immer eine weißes Canvas und sonst nichts.
Hat jemand eine fertige Funktion dafür, abgesehen von der DLL, die vorher erwähnt wurde?


Delphi-Quellcode:

  function ScreenshotHidden1(wnd: HWND; const bmp: TBitmap): Boolean;
  var
    rec: TRect; //zum Zwischenspeichern der Fenstergröße
    caption: string;


    Size : Cardinal;
    MemLocal : ^TBitmap;
    MemRemote : ^TBitmap;
    Process : THandle;
    ProcessId : DWORD;
    NumBytes : Cardinal;
    ListView : HWND;
    b : TBitmap;
    InfoHeaderSize : Cardinal;
    ImageSize : Cardinal;


   begin
    Result := False; //Rückgabewert initialisieren

    GetWindowRect(wnd, rec); //Größe des Fensters auslesen...
    bmp.Width := rec.Right - rec.Left; //...und die Bitmap-Größe anpassen
    bmp.Height := rec.Bottom - rec.Top;
    bmp.PixelFormat := pf24Bit; // Datenmassen in Zaum halten

    bmp.SetSize (bmp.Width, bmp.Height);

    {Graphics.}GetDIBSizes (bmp.Handle, InfoHeaderSize, ImageSize);


    bmp.Canvas.Lock; //Zugriff auf den Canvas für andere Threads blockieren

    ShowMessage(Format('Breite "%d", Höhe "%d"',[bmp.Width,bmp.Height]));
    try

      b:=TBitmap.Create;
      b.Width:=bmp.Width;
      b.Height:=bmp.Height;
      b.PixelFormat:=bmp.PixelFormat;

     
      // Fensterhandle des Desktop-ListView ermitteln und Prozess oeffnen
      ListView := wnd;
      ProcessId := 0;
      GetWindowThreadProcessId(ListView, @ProcessId);

      Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_OPERATION or
                 PROCESS_VM_READ or PROCESS_VM_WRITE, False, ProcessId);
      if Process <> 0 then begin
        try

          Size := ImageSize;

          MemRemote := VirtualAllocEx(Process, nil, Size, MEM_COMMIT, PAGE_READWRITE);
          MemLocal := VirtualAlloc(nil, Size, MEM_COMMIT, PAGE_READWRITE);

          if Assigned(MemLocal) and Assigned(MemRemote) then begin
            SendMessage(wnd, WM_PRINT, Integer(MemRemote), PRF_ERASEBKGND or PRF_CLIENT or PRF_CHILDREN);
          end;

          if ReadProcessMemory(Process, MemRemote, bmp.Canvas, Size, NumBytes) then begin

          end;
        except
        end;
      end;


      finally
        bmp.Canvas.Unlock; //Zugriff wieder erlauben
      end;
  end;
Matthias
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#7

Re: Screenshot eines anderen Programmes mit wm_print

  Alt 14. Feb 2009, 20:50
Zitat von zeras:
Da ich einen Screenshot unter Win2000 brauche, hilft mir die Funktion "Printwindow" nicht weiter. Diese gibt es erst ab XP.
Nun habe ich versucht, mit LuckieDIPS mir was zusammenzubauen, aber die Windowsfunktionen sind nicht so mein Ding.
Ich habe mal meinen Versuch angehängt, aber er bringt nur immer eine weißes Canvas und sonst nichts.
Hat jemand eine fertige Funktion dafür, abgesehen von der DLL, die vorher erwähnt wurde?
also mit der Funktion: myBMPWindowSnap

im Link
http://www.delphipraxis.net/internal...32+printwindow


geht es eigentlich immer ganz gut.
Windows2000? .. fast 10 Jahre .. ich frage Dich, bist du wirklich so schlecht bezahlt?
Ich frag mal ironisch, für DOS muss es aber nicht mehr funktionieren, oder?

Wieviel Stunden sitzt Du schon an dem Problem?
Schenk Deinem Kunden eine Windows XP Lizenz zu Deinem Programm dazu ..

gibts für 50 Euro bei Amazon .. hmmm

http://www.amazon.de/Windows-Profess...4644512&sr=1-4

dann läuft das ...

sorry, wenn ich jetzt böse war ...
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Screenshot eines anderen Programmes mit wm_print

  Alt 15. Feb 2009, 07:05
@stoxx: Windows2000 ist ein Betriebssystem was noch sehr häufig verwendet wird und das nicht wegen fehlendem Geld sondern weil es sehr stabil ist. Ich kenne einige welche Windows2000 bevorzugen.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Screenshot eines anderen Programmes mit wm_print

  Alt 15. Feb 2009, 08:21
Es gibt sogar noch einige (größere Mrd. €) Firmen die auch ihre neuen PC generell mit W2K ausrüsten.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.618 Beiträge
 
Delphi 12 Athens
 
#10

Re: Screenshot eines anderen Programmes mit wm_print

  Alt 15. Feb 2009, 09:00
@stoxx

Deine Info, ich soll myBMPWindowSnap nutzen, hatte ich in meinem Beitrag schon ausgeschlossen, da es nicht unter W2K läuft. Dies habe ich schon ausprobiert. Unter XP läuft dies.
Wie die Vorgänger schon sagen, gibt es viele Firmen, die noch W2K nutzen und die werden nicht wegen meinem Programm umsteigen.

Ziel ist eigentlich, die Screenschots aus einem VNC Viewer abzuspeichern. Das Programm war schon fertig und funktionierte, bis es auf W2K Rechnern installiert wurde. OK, man kann auch mit ALT-Druck eine Kopie machen und dann aus der Zwischenablage einlesen, beschneiden und abspeichern, aber die Funktion würde einiges noch vereinfachen und man kann eher mal was automatisieren.
Vielleicht gibt es ja auch einen VNC Viewer, der das direkt machen kann.
Möglicherweise kann Luckie nochmal drüberschauen. Er hat ja die Info gebracht, wie es zu machen wäre. Dies habe ich versucht, umzusetzen, aber offensichtlich gibt es da noch Verständnisprobleme mit Windows Funktionen.
Matthias
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 09:48 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