Announcement

Collapse
No announcement yet.

Screenshots

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Screenshots

    Hallo<BR>
    <BR>
    Ich wollte nur mal fragen ob jemand weiß wie ich so schnell wie möglich und so oft wie möglich screenshots machen kann? Ich brauche den Kompletten Desktop, könnte mann vieleicht über DirectX die Daten direckt aus dem Grafikspeicher holen?? <BR>
    Vielen Dank im vorraus<BR>
    <BR>
    Daniel

  • #2
    Hi<br>
    Kleines Beispiel für das aktive Window als JPEG, dann musst du nur JPEG Stream in eine Datei speichern<br>
    hr
    USES JPEG; nicht vergessen
    function TForm1.GetActiveWindow(var S: String): hwnd;<br>
    var<br>
    szTitel:array[0..199] of Char;<br>
    begin<br>
    Result:= GetForegroundWindow;<br>
    GetWindowText(Result, szTitel, SizeOf(szTitel));<br>
    S := szTitel<br>
    end;<br>
    <br>
    procedure TForm1.MakeScreenDump;<br>
    var BMP:TBitmap;<br>
    DC:HDC;<br>
    JPEG:TJPEGImage;<br>
    WName:String;<br>
    MyWindow:HWND;<br>
    MyRect:TRect;<br>
    begin<br>
    Try<br>
    // Lade den Bilschirm in eine Bitmap<br>
    BMP:=TBitmap.Create;<br>
    MyWindow:=GetActiveWindow(WName);<br>
    GetWindowRect(MyWindow,MyRect);<br>
    DC:=GetWindowDc(MyWindow);<br>
    <br>
    BMP.Width:=MyRect.Right - MyRect.Left;<br>
    BMP.Height:=MyRect.Bottom - MyRect.Top;<br>
    BitBlt<br>(BMP.Canvas.Handle,0,0,Screen.Width,Scre en.Height,DC,0,0,SRCCopy);<br>
    ReleaseDc(0,dc);<br>
    // Konvertiere zu JPEG<br>
    JPEG:=TJPEGImage.Create;<br>
    JPEG.Performance:=jpBestQuality;<br>
    JPEG.CompressionQuality:=100;<br>
    JPEG.Assign(Bmp);<br>
    // Ab in Stream<br>
    If WName = WOldName Then inc(Prefix)else Prefix:=0;<br>
    JPEG.SaveToFile(WName+IntToStr(Prefix)+'.jpg');<br >
    WOldName:=WName;<br>
    // Weg zum Host<br>
    Finally<br>
    BMP.Free;<br>
    JPEG.Free;<br>
    end;<br>
    end;
    <hr>
    <br><br>Gruß<br>Andrea

    Comment


    • #3
      Hallo,
      das Beispiel hat mir auch schon sehr viel weitergeholfen, ich habe aber noch eine etwas andere Variante mit einem Problem zu lösen: Der Inhalt einer Form soll als JPEG abgespeichert werden, dazu habe ich, wie schon an anderer Stelle in diesem Forum beschrieben, ein CanvasPanel erzeugt (Nachfahre von TPanel mit Canvas als public) siehe unten.

      Problem: Es wird immer das weggeschrieben, was gerade auf dem Screen im Bereich des Panels sichtbar ist. Solange die Form im Vordergrund komplett sichtbar ist funktioniert alles, wenn aber ein anderes Fenster davor gerät oder das Fenster minimiert wird oder der Bildschirmschoner zuschlägt klappt es aber nicht mehr. Es wird immer das weggeschrieben was gerade im Bereich der Form auf dem Screen sichtbar ist.

      Hat jemand eine Idee wie man das macht?

      TYPE
      TCanvasPanel = CLASS( TPanel)
      public
      property Canvas;
      end;

      procedure TForm1.BitBtnSaveGraphicClick(Sender: TObject);
      var
      BMP:TBitmap;
      JPEG:TJPEGImage;
      begin
      BMP := NIL;
      JPEG := NIL;
      Try // Lade den Bilschirm in eine Bitmap
      BMP:=TBitmap.Create;
      BMP.Width:= Form2.CanvasPanel1.Width;
      BMP.Height:= Form2.CanvasPanel1.Height;

      BitBlt(BMP.Canvas.Handle,0,0,Form2.CanvasPanel1.Wi dth,Form2.CanvasPanel1.Height,
      Form2.CanvasPanel1.Canvas.Handle,0,0,SRCCopy);
      // Konvertiere zu JPEG
      JPEG:=TJPEGImage.Create;
      JPEG.Performance:=jpBestQuality;
      JPEG.CompressionQuality:=100;
      JPEG.Assign(BMP);
      JPEG.SaveToFile( SaveDialog1.FileName );
      Finally
      BMP.Free;
      JPEG.Free;
      end;
      end;
      Zuletzt editiert von Gary Hasfun; 11.03.2009, 14:56.

      Comment

      Working...
      X