![]() |
Screenshot erstellen und speichern
Hallo Wissende,
Ich habe gerade mal eine kurze Frage, habe bei der Suchfunktin nicht das richtige gefunden. Ich programmiere gerade an einem Programm, dass 25 Screenshots pro Sekunde erstellen soll. Und in ein bestimmtes Verzeichnis speichern soll. Eigentlich ja ganz einfach glaube ich. Doch leider kenne ich den Befehl zum erstellen eines Screenshots nicht. Ich hoffe ihr könnt mir da weiterhelfen. |
Re: Screenshot erstellen und speichern
![]() |
Re: Screenshot erstellen und speichern
Hi,
auch wenn dir jmd. schon die Lösung rausgesuch hat (und ich mich hier "namentlich" ausgeschlossen fühle), für's nächste Mal (oder ale Erklärung für Florians Ergebnisse), schränke die Suche auf die Code-Lib (Code Bibliothek in der Suche genannt) ein. Da findest du dann fertigen Code! Gruß Der Unwissende |
Re: Screenshot erstellen und speichern
schon mal vielen Dank, werde ich mir aufjeden Fall angucken... :-D
|
Re: Screenshot erstellen und speichern
So habs mir mal angeguckt, hab aber noch ne Frage:
Ich habe mir jetzt eine Prozedure rausgesucht...
Delphi-Quellcode:
... und rufe die hiermit auf...
procedure ScreenToFile(aFileName: string);
var Bitmap: TBitmap; Canvas: TCanvas; begin Canvas := TCanvas.Create; try Canvas.Handle := GetWindowDC(0); try Bitmap := TBitmap.Create; try Bitmap.Width := Screen.DesktopWidth; Bitmap.Height:= Screen.DesktopHeight; Bitmap.PixelFormat := pfDevice; (* Bitmap.Canvas.CopyRect(Screen.DesktopRect, Canvas, Screen.DesktopRect); Anstatt der folgenden Zeile, kann auch die CopyRect Funktion genutzt werden. Die CopyRect-Funktion nutzt zusätzlich ein paar Schutzmechanismen, welche für ScreenShots nicht notwendig sind. Ausserdem greift die CopyRect-Funktion auf StretchBlt-Funktion zurück, welche langsamer als BitBlt ist. *) BitBlt(Bitmap.Canvas.Handle, 0, 0, Pred(Screen.DesktopWidth), Pred( Screen.DesktopHeight), Canvas.Handle, Screen.DesktopLeft, Screen.DesktopTop, Bitmap.Canvas.CopyMode); Bitmap.SaveToFile(aFileName); finally Bitmap.Free; end; finally ReleaseDC(0, Canvas.Handle); end; finally Canvas.Free; end; end;
Delphi-Quellcode:
...aber wo speichert die Anwendung den Screenshot jetzt hin ????
procedure TForm1.Button1Click(Sender: TObject);
begin screentofile('testscreen'); end; EDIT: Ach habs schon rausgefunden...war mal wieder zu blöd... Die Aufrufprozedure muss so heißen...
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin screentofile('D:\testscreen.bmp'); end; |
Re: Screenshot erstellen und speichern
Du musst nicht nur einen Namen sondern den ganzen Pfad angeben:
Delphi-Quellcode:
gruss
procedure TForm1.Button1Click(Sender: TObject);
begin screentofile('C:\testscreen.bmp'); end; |
Re: Screenshot erstellen und speichern
|
AW: Screenshot erstellen und speichern
Hallo Gemeinde,
ja, das Thema ist schon ein paar Tage alt, aber irgendwie stelle ich mich etwas dusselig an. Ich habe herausgefunden, wie ich einen Screenshot eines ganzen Desktops machen kann, auch kann ich einen Screenshot der aktiven Anwendung machen, allerdings habe ich nicht herausgefunden, wie ich nur einen Teil des Desktops oder einer Anwendung als Screenshot aufnehmen kann. Vielleicht kann mir dazu jemand einen Tipp geben? Hintergrund: Ich möchte kopierten Text auslesen, diesen in eine Maske aufbereiten und diese Maske soll dann als Screenshot (Grafik) weiter verarbeitet werden. LG Micha (DieFliege) |
AW: Screenshot erstellen und speichern
Wieso hat niemand gesagt, wie er den Screenshot macht?
Es gibt tausende Wege. Zitat:
Oder du suchst das gewünschte Fenster (HWND) und machst von dessen DC das Foto, anstatt vom DC des Desktops. |
AW: Screenshot erstellen und speichern
Zitat:
Zitat:
Zitat:
Vielen Dank erst mal für deine Hilfe! LG Micha (DieFliege) |
AW: Screenshot erstellen und speichern
Zitat:
Bezüglich oben dem GetWindowDC aus der #5 ... ein GetWindowDC bzw. GetDC mit anderem Parameter (Fenster/Canvas): FindWindow FindWindowEx EnumWindows ... TForm.Handle (HWND) TForm.Canvas.Handle (HDC) ... Und bezüglich Delphi-Fenster: ![]() ![]() ... TCustomForm.Canvas und Printer. ![]() uvm. |
AW: Screenshot erstellen und speichern
Vielleicht ist das ja schon anderweitig beschrieben, dann sorry. Ich habe schon seit Jahren folgende Routine im Einsatz, die einen bestimmten Bereich des Desktop in eine Bitmap kopiert:
Delphi-Quellcode:
procedure DesktopScreenShot(DestBitmap: TBitmap; SourceRect: TRect);
var DC: HDC; wnd: HWND; begin wnd := GetDesktopWindow; DC := GetDC(wnd); try DestBitmap.SetSize(SourceRect.Width, SourceRect.Height); BitBlt(DestBitmap.Canvas.Handle, 0, 0, SourceRect.Width, SourceRect.Height, DC, SourceRect.Left, SourceRect.Top, SRCCOPY) ; finally ReleaseDC(wnd, DC); end; end; |
AW: Screenshot erstellen und speichern
PS: GetDC(GetDesktopWindow) = GetWindowDC(0), das Desktop=0
wie gesagt, tausende Wege ganz modern könnte man z.B. auch die DesktopImagingAPI (seit Win 8) benutzen, oder wie die nochmal hieß die würde dann auch so Dinge ala DirectDraw erwischen, welche sich direkt über die Grafkkarte ins Bild schmuggeln. |
AW: Screenshot erstellen und speichern
Hi,
vielleicht kannst du das mal Testen, oder zum Spicken... Viele Grüße Steku ![]() |
AW: Screenshot erstellen und speichern
Zitat:
Delphi-Quellcode:
kennt mein Compiler noch nicht. :(
DestBitmap.SetSize(..)
Grüße, Andreas |
AW: Screenshot erstellen und speichern
Hast Du denn Vcl.Graphics in den Uses eingebunden ?
![]() Das sollte es seit " ![]() Siehe weiter unten bei "VclBitmap: Vcl.Graphics.TBitmap;", das müsste VCL unter XE2 gewesen sein. |
AW: Screenshot erstellen und speichern
Ja,
Delphi-Quellcode:
ist eingebunden. Aber in meiner Unit, wo ich solche nützlichen Routinen sammle, benutzen andere Routinen auch
Vcl.Graphics
Delphi-Quellcode:
, und auch dort gibt es ein
Winapi.Windows
Delphi-Quellcode:
. Daher kommt der Konflikt.
SetSize
Wie läßt sich Uwe’s Zeile
Delphi-Quellcode:
mit qualifizierten Bezeichnern schreiben? Direkt geht es nicht, denn DestBitmap ist der Name des Parameters. Auch mit einer Zwischenvariable habe ich es noch nicht hinbekommen… :oops:
DestBitmap.SetSize(SourceRect.Width, SourceRect.Height);
Grüße, Andreas |
AW: Screenshot erstellen und speichern
Etwas habe ich noch vergessen: Ich habe in der Uses-Liste auch noch
Delphi-Quellcode:
, und auch dies hat
Vcl.Forms
Delphi-Quellcode:
und kann strören.:(
SetSize
Edit: Die Fehlermeldung lautet: [dcc32 Fehler]: E2003 Undeklarierter Bezeichner: 'SetSize' |
AW: Screenshot erstellen und speichern
Nein, weil hier ja nicht mit WITH und so gearbeitet wird und es ja explizit BitmapVariable.SetSize heißt.
Schon DelphiXE kannte ein TBitmap.SetSize (hatte es erst dieses Jahr selbst benutzt) |
AW: Screenshot erstellen und speichern
Ich würde die Funktion DesktopScreenShot erstmal in ein eigenes Unit verfrachten, nur mit dem Minimum an Abhängigkeiten,
um das Ganze im ersten Schritt etwas zu modularisieren. Dieses sollte dann in deinem Unit als Uses eingebunden eigentlich arbeiten können oder vielleicht einen besseren Fehlerhinweis liefern. |
AW: Screenshot erstellen und speichern
Inzwischen habe ich alles andere auskommentiert und lediglich die folgenden zwei Units in der Uses-Liste belassen:
Delphi-Quellcode:
Trotzdem kommt die Fehlermeldung: [dcc32 Fehler]: E2003 Undeklarierter Bezeichner: 'SetSize' :(
Uses
Vcl.Graphics, Winapi.Windows; |
AW: Screenshot erstellen und speichern
Könnte bitte jemand folgenden Test mit XE5 kompilieren? :-D
Delphi-Quellcode:
Mein Compiler weigert sich hartnäckig. :cry:
program DesktopScreenShot_Test_1;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, Vcl.Graphics, Winapi.Windows; procedure DesktopScreenShot(DestBitmap: TBitmap; SourceRect: TRect); // https://www.delphipraxis.net/75883-screenshot-erstellen-und-speichern-2.html // #12: von Uwe Raabe // 2022-10-10, um 11:43 Uhr var DC: HDC; wnd: HWND; begin wnd := GetDesktopWindow; DC := GetDC(wnd); try DestBitmap.SetSize(SourceRect.Width, SourceRect.Height); BitBlt(DestBitmap.Canvas.Handle, 0, 0, SourceRect.Width, SourceRect.Height, DC, SourceRect.Left, SourceRect.Top, SRCCOPY) ; finally ReleaseDC(wnd, DC); end; end; begin try except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. Danke! Grüße, Andreas |
AW: Screenshot erstellen und speichern
Hallo
dreh mal die Reihenfolge der units um, zuerst windows und dann graphics. Tbitmap ist in beiden units definiert oder du schreibst
Delphi-Quellcode:
also VCL.Graphics. ...
procedure DesktopScreenShot(DestBitmap: VCL.Graphics.TBitmap
|
AW: Screenshot erstellen und speichern
Danke Keldorn! :thumb:
Mir sind qualifizierte Bezeichner sympathischer:
Delphi-Quellcode:
, denn die Umkehrung der Reihenfolgde der Units könnte u.U. in anderen Routinen für Chaos sorgen!
procedure DesktopScreenShot(DestBitmap: VCL.Graphics.TBitmap; SourceRect: TRect);
Danke Euch allen & Grüße :-D Andreas |
AW: Screenshot erstellen und speichern
Kennst du Strg+Linksklick auf "dein" TBitmap?
Zitat:
Warum ausgerechnet HIER dieser "Pascalname", in der WinAPI, und wenn, warum dann nicht TBitmapHeader. Ist ja fast so ein Schwachsinn, wie das mit den beiden TMonitor. :wall: Lösung 1:
Delphi-Quellcode:
Lösung 2:
uses
Winapi.Windows; System.SysUtils, Vcl.Graphics, // Windows vor Graphics
Delphi-Quellcode:
procedure DesktopScreenShot(DestBitmap: Vcl.Graphics.TBitmap; SourceRect: TRect);
|
AW: Screenshot erstellen und speichern
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz