Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Screenshots erstellen (https://www.delphipraxis.net/214177-screenshots-erstellen.html)

Amateurprofi 29. Nov 2023 09:24

Screenshots erstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich mache Screenshots häufig um Abbildungen von Controls oder Fenstern in Help-Files einzubinden und ging dabei bisher so vor:
1) Taste "Drucken"
2) Paint öffnen
3) Mit Strg-V den Screenshot in Paint übertragen.
4) In Paint den benötigten Bereich freistellen.
5) Speichern.

Problem hierbei:
Wenn ich versuche, im pf4bit oder pf8bit Format zu speichern sind die Farben i.d.R. verfälscht, lasse ich das Format bei pf24bit, bläht das die Helpdateien auf.
Mit z.B. Photoshop das Pixelformat ändern, bringt die gewünschten Ergebnisse, ist aber auf Dauer zeitraubend.

Ich habe jetzt ein kleines Programm erstellt, das die Angelegenheit vereinfacht.
Von der Exe habe ich mehrere Verknüpfungen auf dem Desktop angelegt, die mit unterschiedlichen Shortcuts aufgerufen werden und die die Exe mit unterschiedlichen Parametern aufrufen.

Das Standardverhalten des Programms (ohne Parameter) ist, wie folgt:
1) Wenn beim Aufruf des Programms der Mauszeigen auf ein Control zeigt, wird dieses Control in eine Bitmap kopiert.
2) Andernfalls, wenn Mauszeiger auf ein Fenster zeigt, wird dieses Fenster kopiert.
3) Andernfalls wird der ganze Bildschirm kopiert.
Anschließend wird geprüft, ob die Bitmap ohne Farbverluste in eines der Pixelformate pf1bit, pf4bit oder pf8bit umgewandelt werden kann, und ggfs. die Bitmap in das "kleinstmögliche" dieser Formate umgewandelt.
Wenn eine Umwandlung ohne Farbverluste nicht möglich ist, wird die Bitmap in pf8bit umgewandelt, wobei Farbverluste auftreten, die i.d.R. visuell nicht wahrnehmbar sind, umgewandelt.
Die Bitmap wird in jedem Fall ins Clipboard kopiert, und als .bmp-Datei gespeichert.

Wenn dem Programm ein Parameterstring übergeben wird, hängt das Verhalten des Programms hiervon ab.
Eine Erklärung der unterstützten Parameter befindet sich oberhalb der Prozedur "CopyFromScreen" im Anhang.

Kas Ob. 29. Nov 2023 10:03

AW: Screenshots erstellen
 
Liste der Anhänge anzeigen (Anzahl: 3)
Have you considered using PNG ?

here an example the attachment is screen shot with 1793x879 pixel and sizes are :
PNG : 65.7 KB (67,300 bytes)
JPG : 239 KB (245,146 bytes)
BMP : 4.50 MB (4,729,074 bytes)


Anhang 56470Anhang 56471

I had to archive the PNG to prevent the resizing and keep the quality and pixels.
Anhang 56472

ps: for my screenshot daily usage i use GreenShot https://getgreenshot.org/

jziersch 29. Nov 2023 10:18

AW: Screenshots erstellen
 
Windows contains a standard program:

Ausschneiden und Skizzieren / Snipping Tool

It is pretty usable and offers saving to PNG.

Sherlock 29. Nov 2023 10:36

AW: Screenshots erstellen
 
Wie wird das Programm gestartet? Die Maus zeigt ja immer auf das Icon, wenn man die Maus nutzt. Wenn man per Tastatur startet, hat sich der Focus geändert. Besser wäre es, das Programm würde ständig laufen oder meinetwegen die "Drucken" Taste Hooken, dann aber machen die zahlreichen Parameter wenig Sinn.

himitsu 29. Nov 2023 10:38

AW: Screenshots erstellen
 
Ja, in aktuelleren Windowsen (10/11) liegt auf der Print-Taste ein neues Standardtool von Microsoft. (früher mußte man es noch manuell starten, bzw. aus dem Appstore installieren)
* das kann den ganzen Bildschirm in die Zwischenablage kopieren, oder ein Fenster, bzw. einen freien Bereich
* sowie das Ganze als Bild oder Video

* Achtung, nach dem Stop werden Videos nicht automatisch gespeichert
* Fotos kommen standardmäßig in die Zwischenablage, sowie ist seit Windows 11 auch das Automatisch Speichern standardmäßig aktiv
* * C:\Users\%username%\Pictures\Screenshots
* manuell speichern oder noch beaarbeiten -> Klick auf Popup oder in den Benachrichtigungen (falls man das nicht deaktiviert hat)

*
Delphi-Quellcode:
Snipping Tool
, bzw.
Delphi-Quellcode:
Ausschneiden und skizzieren
(lässt sich auch im Startmenü finden)
* * reagiert es nicht direkt auf [Drucken], oder geht irgendwas automatisch oder nicht ... siehe im Programm, oben Rechts, in den 3 Punkten -> Einstellungen

ansonsten gäbe es z.B. auch Bei Google suchenSnagIt

jziersch 29. Nov 2023 11:10

AW: Screenshots erstellen
 
Zitat:

Zitat von Sherlock (Beitrag 1530211)
Wie wird das Programm gestartet? Die Maus zeigt ja immer auf das Icon, wenn man die Maus nutzt.

Ausschneiden und Skizzieren kann einen Screenshot nach 3 oder 10 Sekunden starten. Man hat also Zeit ein Popupmenü o.ä. zu öffnen.

Sherlock 29. Nov 2023 11:20

AW: Screenshots erstellen
 
Zitat:

Zitat von jziersch (Beitrag 1530213)
Zitat:

Zitat von Sherlock (Beitrag 1530211)
Wie wird das Programm gestartet? Die Maus zeigt ja immer auf das Icon, wenn man die Maus nutzt.

Ausschneiden und Skizzieren kann einen Screenshot nach 3 oder 10 Sekunden starten. Man hat also Zeit ein Popupmenü o.ä. zu öffnen.

Das weiß ich, ich bin aber noch mit dem Programm des Amateurprofis beschäftigt.

peterbelow 29. Nov 2023 11:32

AW: Screenshots erstellen
 
Zitat:

Zitat von Sherlock (Beitrag 1530211)
Wie wird das Programm gestartet? Die Maus zeigt ja immer auf das Icon, wenn man die Maus nutzt. Wenn man per Tastatur startet, hat sich der Focus geändert. Besser wäre es, das Programm würde ständig laufen oder meinetwegen die "Drucken" Taste Hooken, dann aber machen die zahlreichen Parameter wenig Sinn.

Win + Shift + S

Sherlock 29. Nov 2023 11:42

AW: Screenshots erstellen
 
Danke...siehe #7.

dummzeuch 29. Nov 2023 12:41

AW: Screenshots erstellen
 
Zitat:

Zitat von Sherlock (Beitrag 1530211)
Wie wird das Programm gestartet?

Steht doch im Urprsungspost: Mittels konfigurierter Tastenkürzel in Desktop-Shortrcuts.

Sherlock 29. Nov 2023 13:15

AW: Screenshots erstellen
 
Zitat:

Zitat von dummzeuch (Beitrag 1530217)
Zitat:

Zitat von Sherlock (Beitrag 1530211)
Wie wird das Programm gestartet?

Steht doch im Urprsungspost: Mittels konfigurierter Tastenkürzel in Desktop-Shortrcuts.

Fand ich halt etwas unpraktisch. Wie ich ja dann noch erläuterte.

Amateurprofi 29. Nov 2023 22:25

AW: Screenshots erstellen
 
Zitat:

Zitat von Kas Ob. (Beitrag 1530208)
Have you considered using PNG ?

here an example the attachment is screen shot with 1793x879 pixel and sizes are :
PNG : 65.7 KB (67,300 bytes)
JPG : 239 KB (245,146 bytes)
BMP : 4.50 MB (4,729,074 bytes)


Anhang 56470Anhang 56471

I had to archive the PNG to prevent the resizing and keep the quality and pixels.
Anhang 56472

ps: for my screenshot daily usage i use GreenShot https://getgreenshot.org/

Thank you Kas Ob.
As explained, I need this mainly to include bitmaps into HelpFiles.
I use the Windows Help Workshop which supports only .bmp files.

Stevie 29. Nov 2023 22:36

AW: Screenshots erstellen
 
Zitat:

Zitat von Amateurprofi (Beitrag 1530248)
I use the Windows Help Workshop which supports only .bmp files.

Du meinst diesen Windows Help Workshop?
Ich frage, weil dort steht, dass

Zitat:

It supports HTML, ActiveX, Java, scripting languages (JScript, and Microsoft Visual Basic Scripting Edition), and HTML image formats (.jpeg, .gif, and .png files).

Amateurprofi 29. Nov 2023 22:49

AW: Screenshots erstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Stevie (Beitrag 1530249)
Zitat:

Zitat von Amateurprofi (Beitrag 1530248)
I use the Windows Help Workshop which supports only .bmp files.

Du meinst diesen Windows Help Workshop?
Ich frage, weil dort steht, dass

Zitat:

It supports HTML, ActiveX, Java, scripting languages (JScript, and Microsoft Visual Basic Scripting Edition), and HTML image formats (.jpeg, .gif, and .png files).

Ich benutze diesen Help-Workshop (hcw.exe)

Amateurprofi 29. Nov 2023 22:50

AW: Screenshots erstellen
 
Zitat:

Zitat von jziersch (Beitrag 1530209)
Windows contains a standard program:

Ausschneiden und Skizzieren / Snipping Tool

It is pretty usable and offers saving to PNG.

Windows 7

Amateurprofi 29. Nov 2023 22:53

AW: Screenshots erstellen
 
Zitat:

Zitat von Sherlock (Beitrag 1530211)
Wie wird das Programm gestartet? Die Maus zeigt ja immer auf das Icon, wenn man die Maus nutzt. Wenn man per Tastatur startet, hat sich der Focus geändert. Besser wäre es, das Programm würde ständig laufen oder meinetwegen die "Drucken" Taste Hooken, dann aber machen die zahlreichen Parameter wenig Sinn.

"Von der Exe habe ich mehrere Verknüpfungen auf dem Desktop angelegt, die mit unterschiedlichen Shortcuts aufgerufen werden und die die Exe mit unterschiedlichen Parametern aufrufen."

Amateurprofi 29. Nov 2023 22:55

AW: Screenshots erstellen
 
Zitat:

Zitat von himitsu (Beitrag 1530212)
Ja, in aktuelleren Windowsen (10/11) liegt auf der Print-Taste ein neues Standardtool von Microsoft. (früher mußte man es noch manuell starten, bzw. aus dem Appstore installieren)
* das kann den ganzen Bildschirm in die Zwischenablage kopieren, oder ein Fenster, bzw. einen freien Bereich
* sowie das Ganze als Bild oder Video

* Achtung, nach dem Stop werden Videos nicht automatisch gespeichert
* Fotos kommen standardmäßig in die Zwischenablage, sowie ist seit Windows 11 auch das Automatisch Speichern standardmäßig aktiv
* * C:\Users\%username%\Pictures\Screenshots
* manuell speichern oder noch beaarbeiten -> Klick auf Popup oder in den Benachrichtigungen (falls man das nicht deaktiviert hat)

*
Delphi-Quellcode:
Snipping Tool
, bzw.
Delphi-Quellcode:
Ausschneiden und skizzieren
(lässt sich auch im Startmenü finden)
* * reagiert es nicht direkt auf [Drucken], oder geht irgendwas automatisch oder nicht ... siehe im Programm, oben Rechts, in den 3 Punkten -> Einstellungen

ansonsten gäbe es z.B. auch Bei Google suchenSnagIt

Ich arbeite mit Windows 7.

Delphi.Narium 29. Nov 2023 22:56

AW: Screenshots erstellen
 
HardCopys von Formularen mache ich immer aus dem Programm selbst heraus:
Delphi-Quellcode:
procedure HardCopy(sJpegFile : String; fm : TForm);
Var
          FJpeg    : TJpegImage;
begin
  try
    if SysUtils.FileExists(sJpegFile) then SysUtils.DeleteFile(sJpegFile);
    if fm.WindowState = wsMinimized then fm.WindowState := wsNormal;
    fm.Show;
    fm.Refresh;
    FJpeg := TJpegImage.Create;
    try
      try
        FJpeg.Assign(fm.GetFormImage);
        fJPeg.SaveToFile(sJpegFile);
      except
        on e : Exception do begin
          MessageDlg(e.Message,mtError,[mbOk],0);
        end;
      end;
    except
      // Fehler werden ignoriert, da sie nicht behoben werden können.
    end;
  finally
    FJpeg.Free;
  end;
end;
Die Routine sollte sich mit wenig Aufwand auf BMP umbauen lassen.

Aufruf:
Delphi-Quellcode:
HardCopy('Dateiname.jpg', Form1);


Oder (sinngemäß) sowas in der Art:
Delphi-Quellcode:
var
  i : Integer;
  s : String;
begin
  for i := 0 to Screen.FormCount - 1 do begin
    s := Format('c:\temp\%s.jpg',[Screen.Forms[i].Name]);
    HardCopy(s, Screen.Forms[i]);
  end;
end;
Die älter Version des Help-Workshop, die für die .hlp-Dateien war und als Quelltext RTF-Dateien verlangte, konnte nur .bmp-Dateien verarbeiten.

Der HTML-Help-Workshop (hcw.exe) für die .chm-Dateien, kann alles verarbeiten, was man so in HTML-Dateien "verwursten" kann, da da (zumindest in den älteren Windowsversionen) die Hilfe über eine eingebettete Version des Internetexplorers angezeigt wurde. Von daher sind JPG-Dateien absolut ok.

Keine Ahnung, wie das aktuell läuft. (ok: Unter Windows 10 sieht es genauso aus wie unter NT, XP, ... ;-))

Amateurprofi 29. Nov 2023 23:10

AW: Screenshots erstellen
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1530254)
HardCopys von Formularen mache ich immer aus dem Programm selbst heraus:
Delphi-Quellcode:
procedure HardCopy(sJpegFile : String; fm : TForm);
Var
          FJpeg    : TJpegImage;
begin
  try
    if SysUtils.FileExists(sJpegFile) then SysUtils.DeleteFile(sJpegFile);
    if fm.WindowState = wsMinimized then fm.WindowState := wsNormal;
    fm.Show;
    fm.Refresh;
    FJpeg := TJpegImage.Create;
    try
      try
        FJpeg.Assign(fm.GetFormImage);
        fJPeg.SaveToFile(sJpegFile);
      except
        on e : Exception do begin
          MessageDlg(e.Message,mtError,[mbOk],0);
        end;
      end;
    except
      // Fehler werden ignoriert, da sie nicht behoben werden können.
    end;
  finally
    FJpeg.Free;
  end;
end;
Die Routine sollte sich mit wenig Aufwand auf BMP umbauen lassen.

Aufruf:
Delphi-Quellcode:
HardCopy('Dateiname.jpg', Form1);


Oder (sinngemäß) sowas in der Art:
Delphi-Quellcode:
var
  i : Integer;
  s : String;
begin
  for i := 0 to Screen.FormCount - 1 do begin
    s := Format('c:\temp\%s.jpg',[Screen.Forms[i].Name]);
    HardCopy(s, Screen.Forms[i]);
  end;
end;
Die älter Version des Help-Workshop, die für die .hlp-Dateien war und als Quelltext RTF-Dateien verlangte, konnte nur .bmp-Dateien verarbeiten.

Der HTML-Help-Workshop (hcw.exe) für die .chm-Dateien, kann alles verarbeiten, was man so in HTML-Dateien "verwursten" kann, da da (zumindest in den älteren Windowsversionen) die Hilfe über eine eingebettete Version des Internetexplorers angezeigt wurde. Von daher sind JPG-Dateien absolut ok.

Keine Ahnung, wie das aktuell läuft. (ok: Unter Windows 10 sieht es genauso aus wie unter NT, XP, ... ;-))

Zu
Zitat:

HardCopys von Formularen mache ich immer aus dem Programm selbst heraus:
Also in jedes Programm diese Prozedur integrieren?
Sorry, aber da finde ich es schon praktischer, einfach nur Zum Beispiel AltGr+B zu drücken.

Delphi.Narium 29. Nov 2023 23:25

AW: Screenshots erstellen
 
Nö, die Routine ist Teil einer Unit, die ich sowieso in jedes Programm mit einbinden muss, da sie durchaus noch weitere sinnvolle Aufgaben erledigt. (Gesamtes Laden und Speichern der konfigurierbaren Einstellungen, zentrale Fehlerbehandlung aller Fehler, die nicht vernünftig im Quelltext abgehandelt wurden, Aufruf des (programm)eigenen Hilfesystems (EPub-Format), ...)

Das sie auch die HardCopy-Routine enthält ist nur ein kleines Schmanckerl.

Wenn Du das auch so löst, dann kannst Du der Routine ja den ShortCut ALTGr+B geben. Damit muss Du im Arbeitsablauf dann nicht mal was ändern ;-)

Delphi.Narium 30. Nov 2023 01:39

AW: Screenshots erstellen
 
Die Methode GetFormImage liefert doch schon ein Bitmap, damit müsste eigentlich auch sowas gehen:
Delphi-Quellcode:
form1.GetFormImage.SaveToFile('c:\temp\' + Form1.Name + '.bmp');


Delphi-Quellcode:
for var i : Integer := 0 to Screen.FormCount - 1 do    Screen.Forms[i].GetFormImage.SaveToFile(Format('c:\temp\%s.bmp',[Screen.Forms[i].Name]));

himitsu 30. Nov 2023 01:50

AW: Screenshots erstellen
 
Free :roll:

https://docwiki.embarcadero.com/Code...Image_(Delphi)

Delphi.Narium 30. Nov 2023 07:25

AW: Screenshots erstellen
 
Heißt das, dass oben in meiner Routine mit dem
Delphi-Quellcode:
 FJpeg.Assign(fm.GetFormImage);
auch ein Speicherloch entsteht?

himitsu 30. Nov 2023 08:32

AW: Screenshots erstellen
 
Natürlich.

Delphi-Quellcode:
function TCustomForm.GetFormImage: TBitmap;
begin
  Result := TBitmap.Create;

Delphi.Narium 30. Nov 2023 09:11

AW: Screenshots erstellen
 
Mist, warum hat mich FastMM noch nie darauf hingewiesen?

Da muss dann noch mehr im Argen liegen :-(

So besser?
Delphi-Quellcode:
{ Bildschirmfoto eines Formulars machen und als JPeg speichern.               }
procedure HardCopy(sJpegFile : String; fm : TForm);
Var
  FJpeg : Jpeg.TJpegImage;
  FBmp : Graphics.TBitmap;
begin
  if SysUtils.FileExists(sJpegFile) then SysUtils.DeleteFile(sJpegFile);
  if (fm.WindowState = wsMinimized) then fm.WindowState := wsNormal;
  fm.Show;
  fm.Refresh;
  FJpeg := TJpegImage.Create;
  FBmp := fm.GetFormImage;
  try
    try
      FJpeg.Assign(FBmp);
      fJPeg.SaveToFile(sJpegFile);
    except
      on e : Exception do begin
        MessageDlg(e.Message,mtError,[mbOk],0);
      end;
    end;
  finally
    FBmp.Free;
    FJpeg.Free;
  end;
end;
Wenn nicht, sollte ich mir langsam aber sicher ein anderes Hobby suchen :-(

Amateurprofi 30. Nov 2023 21:57

AW: Screenshots erstellen
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1530256)
Nö, die Routine ist Teil einer Unit, die ich sowieso in jedes Programm mit einbinden muss, da sie durchaus noch weitere sinnvolle Aufgaben erledigt. (Gesamtes Laden und Speichern der konfigurierbaren Einstellungen, zentrale Fehlerbehandlung aller Fehler, die nicht vernünftig im Quelltext abgehandelt wurden, Aufruf des (programm)eigenen Hilfesystems (EPub-Format), ...)

Das sie auch die HardCopy-Routine enthält ist nur ein kleines Schmanckerl.

Wenn Du das auch so löst, dann kannst Du der Routine ja den ShortCut ALTGr+B geben. Damit muss Du im Arbeitsablauf dann nicht mal was ändern ;-)


Danke für Deine Mühe, Delphi.Narium,
kommt aber für mich nicht in Frage, weil
Erstens habe ich keine Unit, die ich in alle Projekte einbinde.
Zweitens will ich nicht immer eine Form aus einem aktuell laufenden Programm kopieren.
Drittens will ich nicht immer eine Form, sondern auch nur einzelne Controls kopieren.
etc.

Vor allem:
Ich habe doch ein perfekt auf meine Bedürfnisse zugeschnittenes Programm, das ich durch Shortcuts aufrufen kann, ohne vorher ein Programm zu starten.
Übrigens hatte ich früher in meine Programme etwas ähnliches integriert, zum Beispiel
https://www.delphipraxis.net/204883-...rgleichen.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:37 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