Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Screenshot erstellen und speichern (https://www.delphipraxis.net/75883-screenshot-erstellen-und-speichern.html)

himitsu 10. Okt 2022 11:36

AW: Screenshot erstellen und speichern
 
Zitat:

Zitat von DieFliege (Beitrag 1513025)
Ich habe in keinem Wort gefragt "wie" ein Screenshot gemacht wird - Das war mir schon klar ;-)

Ja klar, aber entsprechend dem Wie gibt es auch unterschiedliche Antworten, bezüglich dem "wie weiter" :zwinker:

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:
Delphi-Referenz durchsuchenTCustomForm.Print
Delphi-Referenz durchsuchenTCustomForm.GetFormImage
...
TCustomForm.Canvas und Printer.Delphi-Referenz durchsuchenCanvas.Draw
uvm.

Uwe Raabe 10. Okt 2022 11:43

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;

himitsu 10. Okt 2022 11:46

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.

Steku 10. Okt 2022 12:27

AW: Screenshot erstellen und speichern
 
Hi,

vielleicht kannst du das mal Testen, oder zum Spicken...

Viele Grüße
Steku

http://www.frontiernet.net/~w2m/apprehend.html

Andreas13 10. Okt 2022 17:28

AW: Screenshot erstellen und speichern
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1513029)
...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;

Sind da irgendwelche "neueren" Features dabei Uwe, denn unter XE5 kann ich Deine Routine leider nicht kompilieren:
Delphi-Quellcode:
DestBitmap.SetSize(..)
kennt mein Compiler noch nicht. :(
Grüße, Andreas

Rollo62 10. Okt 2022 17:38

AW: Screenshot erstellen und speichern
 
Hast Du denn Vcl.Graphics in den Uses eingebunden ?
https://docwiki.embarcadero.com/Libr...Bitmap.SetSize
Das sollte es seit "Ewigkeiten" so geben.
Siehe weiter unten bei "VclBitmap: Vcl.Graphics.TBitmap;", das müsste VCL unter XE2 gewesen sein.

Andreas13 10. Okt 2022 18:03

AW: Screenshot erstellen und speichern
 
Ja,
Delphi-Quellcode:
Vcl.Graphics
ist eingebunden. Aber in meiner Unit, wo ich solche nützlichen Routinen sammle, benutzen andere Routinen auch
Delphi-Quellcode:
Winapi.Windows
, und auch dort gibt es ein
Delphi-Quellcode:
SetSize
. Daher kommt der Konflikt.
Wie läßt sich Uwe’s Zeile
Delphi-Quellcode:
DestBitmap.SetSize(SourceRect.Width, SourceRect.Height);
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:
Grüße, Andreas

Andreas13 10. Okt 2022 18:10

AW: Screenshot erstellen und speichern
 
Etwas habe ich noch vergessen: Ich habe in der Uses-Liste auch noch
Delphi-Quellcode:
Vcl.Forms
, und auch dies hat
Delphi-Quellcode:
SetSize
und kann strören.:(

Edit:
Die Fehlermeldung lautet: [dcc32 Fehler]: E2003 Undeklarierter Bezeichner: 'SetSize'

himitsu 10. Okt 2022 18:26

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)

Rollo62 10. Okt 2022 18:35

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:41 Uhr.
Seite 2 von 3     12 3      

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