Screenshot in Konsolenanwendung

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Pseudo
Beiträge: 21
Registriert: Fr 28. Sep 2012, 17:31

Screenshot in Konsolenanwendung

Beitrag von Pseudo »

Hallo,
ich versuche jetzt schon etwas länger einen kompletten Screenshot in einer Konsolenanwendung zu erstellen. Die Funktion GetDC kennt Lazarus nicht, und ich müsste die komplette LCL einbinden (dann könnte ich aber gleich ne Windows Forms Anwendung machen). Ich hoffe es gibt da irgendeine Windows Funktion, oder Bibliothek :D

Danke für die Hilfe

Pseudo

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Screenshot in Konsolenanwendung

Beitrag von Socke »

Pseudo hat geschrieben:ich versuche jetzt schon etwas länger einen kompletten Screenshot in einer Konsolenanwendung zu erstellen. Die Funktion GetDC kennt Lazarus nicht, und ich müsste die komplette LCL einbinden (dann könnte ich aber gleich ne Windows Forms Anwendung machen). Ich hoffe es gibt da irgendeine Windows Funktion, oder Bibliothek :D

In einer Konsolenanwendung kannst du keinen Screenshot machen. Ein Screenshot arbeitet mit einem Pixel-Gerät. Die Konsole ist aber ein Zeichen-Gerät (das heißt du hast Zeichen/Buchstaben und keine Pixel). Daher musst du irgendwie anders den Bildschirmpuffer auslesen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Screenshot in Konsolenanwendung

Beitrag von mschnell »

Vor einiger Zeit habe ich mit Delphi das realisiert (Algorithmus von VNC gestohlen):

Code: Alles auswählen

  DesktopBitmap: TBitmap;
...
 
 wi8 := (wi+7) div 8;
  Result := wi8*hi;
  if Result > XDestsize then begin
    Result := -1;
    exit;
  end;
 
  DesktopBitmap := TBitmap.Create;
  DesktopBitmap.Width := wi;
  DesktopBitmap.Height := hi;
 
  DesktopBitmap.PixelFormat := UsePixelFormat;
 
  DesktopHandle := GetDesktopWindow;
  DesktopHDC := GetDC(DesktopHandle);
  BitBlt(DesktopBitmap.Canvas.Handle, x0dest, y0dest, wi, hi,
         DesktopHDC, x0source, y0source, SrcCopy);
  ReleaseDC(DesktopHandle, DesktopHDC);
 
  GetDIBSizes(DesktopBitmap.Handle, InfoSize, ImageSize);
  Info := AllocMem(InfoSize);
  Image := AllocMem(ImageSize);
 
  if getdib(DesktopBitmap.Handle, 0, Info^, Image^) then begin
//    Edit1.Text := 'OK';
   end else begin
//    Edit1.Text := 'Error';
    FreeMem(Image, ImageSize);
    FreeMem(Info, InfoSize);
    Result := -1;
    exit;
  end;
  DesktopBitmap.Free;
 


-Michael

Antworten