Einzelnen Beitrag anzeigen

zeras

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

Re: Screenshot eines anderen Programmes mit wm_print

  Alt 15. Feb 2009, 14:03
Ich habe dies nun mit der angegebenen Funktion versucht, ein wenig umgebaut und zur Zeit funktioniert diese Funktion.
Ein Problem ist nur, dass, wenn ich die Zeit "sleep(5)" rausnehme, kommt nur ein schwarzes Fenster ohne Inhalt. Dies könnte Probleme bei anderen Rechnern bringen, denn es wird bestimmt nicht immer die Zeit reichen. Bei langsameren Rechner wird das wohl noch mehr sein.
Die Funktion holt erst die Info, welches Fenster genutzt werden soll und dann wird der Screenshot erzeugt. Man muss nur wissen, wie das Programm unter Windows heißt.
Jetzt fällt nur auf, dass das Fenster aktiv in den Vordergrund gebracht wird. Aber für meine Zwecke sollte es mehr oder weniger immer sichtbar sein.
Danke für die Tipps und eventuelle Verbesserungsmöglichkeiten.

Ergänzung: Wenn das Fenster teilweise über den rechten Rand hinausragt, wird es nicht mehr komplett kopiert, sondern es erscheint rechts ein weißer Streifen.

Delphi-Quellcode:
  procedure ScreenShot(wnd: HWND; destBitmap : TBitmap) ;
  var
    w,h : integer;
    DC : HDC;
    hWin : Cardinal;
    r : TRect;

  begin
    SetActiveWindow(wnd);
    SetForegroundWindow(wnd);
    sleep(5);
    hWin := GetForegroundWindow;
    dc := GetWindowDC(hWin) ;
    GetWindowRect(hWin,r) ;
    w := r.Right - r.Left;
    h := r.Bottom - r.Top;
    try
      destBitmap.Width := w;
      destBitmap.Height := h;
      BitBlt(destBitmap.Canvas.Handle,
               0,
               0,
               destBitmap.Width,
               destBitmap.Height,
               DC,
               0,
               0,
               SRCCOPY) ;
    finally
      ReleaseDC(hWin, DC) ;
    end;
  end;


//und Aufruf

  WinName:=Class4Screenshot; //hier den Namen des Programmes übnergeben

  wnd := FindWindow(PChar(WinName), nil); //Handle vom Viewer Fenster

  if wnd=0 then begin
    ShowMessage('Fenster nicht gefunden für Screenshot "'+WinName+'"');
  end
  else begin

    b := TBitmap.Create;
    try
      ScreenShot(wnd, b) ;
      Image1.Picture.Bitmap.Assign(b) ;
    finally
      b.FreeImage;
      FreeAndNil(b) ;
    end;
Matthias
  Mit Zitat antworten Zitat