AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Screenshot bei Tastendruck machen und speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Screenshot bei Tastendruck machen und speichern

Ein Thema von gasty · begonnen am 16. Dez 2009 · letzter Beitrag vom 18. Dez 2009
Antwort Antwort
Seite 2 von 3     12 3      
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#11

Re: Screenshot bei Tastendruck machen und speichern

  Alt 17. Dez 2009, 20:59
if Key = 145 then.....
das reicht vollkommen, da muss nix umgewandelt werden.
Die Drucktaste ist anscheinend eine der Systemtasten, die mit dem standardmäßigen KeyDown keinen Wert liefern.
Die liefert nämlich von Haus aus einen Screenshot. Der befindet sich dann in der Zwischenablage.
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
gasty

Registriert seit: 14. Nov 2007
Ort: Nidderau
80 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: Screenshot bei Tastendruck machen und speichern

  Alt 18. Dez 2009, 10:27
Danke es klappt
So nun ein weiteres Problem:
Ich hab das Programm nun soweit, dass es sich in die Tray Leiste setzt und unsichtbar wird (Hab die Komponente "CoolTrayIcon" und setze Form.Visible auf false).
Nun klappt das mit dem Screenshot aber nicht, wenn das Programm nicht im Fokus ist.
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#13

Re: Screenshot bei Tastendruck machen und speichern

  Alt 18. Dez 2009, 10:48
Nunja, ein unsichtbares Programm-Fenster erhält keine Tastaturereignisse.
Da müsste man Tastatureingaben schon global abfangen (Hook). Aber das hier zu erläutern, würde den Rahmen sprengen. Denn das ist nicht so ohne weiteres mal eben zu lösen.

Eine Alternative wäre, die Drucktaste zu benutzen.
Diese macht ja einen Screenshot und kopiert ihn in die Zwischenablage. Dann vom Programm zyklisch (über Timer) die Zwischenablage abfragen, ob sich der Inhalt geändert hat. Diesen dann holen und abspeichern. Vielleicht gibt es ja auch das Ereignis OnClipBoardChanging (Unit ClipBrd einbinden). Dann könnte man prüfen, ob der ClipBoard-Inhalt ein Bitmap ist und das dann holen und abspeichern. Würde allerdings auch ansprechen, wenn man über Ctrl+C ein Bild in die Zwischenablage kopiert
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
gasty

Registriert seit: 14. Nov 2007
Ort: Nidderau
80 Beiträge
 
Delphi 7 Enterprise
 
#14

Re: Screenshot bei Tastendruck machen und speichern

  Alt 18. Dez 2009, 11:13
Hm ok, das mit den Hooks hab ich mir mal angeschaut, sieht nicht wirklich so einfach aus :/
Aber das mit der Zwischenablage ist wirklich ne gute Idee, nur leider scheitert es wieder an der Umsetzung
Im Moment bin ich so weit:
Delphi-Quellcode:
  Clipboard.Open;
    try
      if not Clipboard.HasFormat(CF_BITMAP) then
        exit;
      Bitmap := TBitmap.Create;
      JPEGImage := TJPEGImage.Create;
      Bitmap.LoadFromClipboardFormat(cf_BitMap,ClipBoard.GetAsHandle(cf_Bitmap),0);
      JPEGImage.Assign(Bitmap);
      JPEGImage.SaveToFile(FormatDateTime('yyyymmddhhnnss',Now)+'.jpg');
    finally
      Bitmap.Free;
      JPEGImage.Free;
    end;
Und er spuckt mir einen Zugriffsverletzungs-Error aus.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#15

Re: Screenshot bei Tastendruck machen und speichern

  Alt 18. Dez 2009, 11:51
Das liegt daran, dass du du Objekte im Try-Abschnit erzeugst, aber im Finally-Abschnitt wieder freigibst. Wenn Clipboard.HasFormat(CF_BITMAP) False ergibt, beendest du ja die Prozedur mit exit. Vorher wird allerdings noch automatisch der Finally-Abschnitt ausgeführt, wo es dann kracht, weil du Objekte freigibst, die noch gar nicht erzeugt wurden.
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#16

Re: Screenshot bei Tastendruck machen und speichern

  Alt 18. Dez 2009, 11:56
Du solltest Bitmap.Assign verwenden.
Ich hab mal ein Testprojekt angehangen, dass die Zwischenablage speichert. Ist aber keine Überprüfunmg drin. Soll nur zur Demo sein.
Compilieren, Exe starten, Druck betätigen und dann auf den Button klicken. Dann ist ein 'blubb.bmp' im Exe-Verzeichnis, das den Screenshot enthält.
Angehängte Dateien
Dateityp: zip screenshot_744.zip (5,2 KB, 11x aufgerufen)
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
gasty

Registriert seit: 14. Nov 2007
Ort: Nidderau
80 Beiträge
 
Delphi 7 Enterprise
 
#17

Re: Screenshot bei Tastendruck machen und speichern

  Alt 18. Dez 2009, 12:10
Nun, wenn ich das in den Timer schreibe, macht er jede Sekunde eine Datei, die aber 0 Byte ist, und keinen Screenshot beinhaltet (selbst wenn ich Druck gedrückt habe).
Daraus schließen sich 2 Probleme: 1. Ich will auch einen Screenshot in der Datei (logisch ) und 2. Ich möchte mit dem Timer ja "überprüfen" ob ein Bild im Clipboard ist, und wenn nicht, einfach nichts tun.
Mein Code sieht jetzt so aus:
Delphi-Quellcode:
  try
    Bitmap := TBitmap.Create;
    JPEGImage := TJPEGImage.Create;
    if not Clipboard.HasFormat(CF_BITMAP) then
      exit
    else
    Bitmap.Assign(ClipBoard);
    //JPEGImage.Assign(Bitmap);
    //JPEGImage.SaveToFile(FormatDateTime('yyyymmddhhnnss',Now)+'.jpg');
    Bitmap.SaveToFile(FormatDateTime('yyyymmddhhnnss',Now)+'.bmp');
  finally
    Bitmap.Free;
    JPEGImage.Free;
  end;
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#18

Re: Screenshot bei Tastendruck machen und speichern

  Alt 18. Dez 2009, 12:33
Das
Delphi-Quellcode:
    if not Clipboard.HasFormat(CF_BITMAP) then
      exit
muss vor das try.
Dann müsste er rausspringen, wenn kein Bild drin ist.
Und nach dem Bild abspeichern einfach ClipBoard.Clear machen. Dann ist es leer.
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
gasty

Registriert seit: 14. Nov 2007
Ort: Nidderau
80 Beiträge
 
Delphi 7 Enterprise
 
#19

Re: Screenshot bei Tastendruck machen und speichern

  Alt 18. Dez 2009, 12:46
Wenn ich es so mache, gibt es wieder einen Zugriffsverletzungs-Error (sofern ich ein Bild im Clipboard habe, also klappt das mit dem rausspringen schonmal)
Delphi-Quellcode:
  if not Clipboard.HasFormat(CF_BITMAP) then
    exit
  else
  try
    Bitmap := TBitmap.Create;
    JPEGImage := TJPEGImage.Create;
    Bitmap.Assign(ClipBoard);
    //JPEGImage.Assign(Bitmap);
    //JPEGImage.SaveToFile(FormatDateTime('yyyymmddhhnnss',Now)+'.jpg');
    Bitmap.SaveToFile(FormatDateTime('yyyymmddhhnnss',Now)+'.bmp');
    ClipBoard.Clear;
  finally
    Bitmap.Free;
    JPEGImage.Free;
  end;
Delphi zeigt mir an, dass es irgendwas mit der Zeile ClipBoard.Clear zu tun hat

Außerdem werden zwar Bitmaps erstellt, aber sie sind alle 0 Byte groß und beinhalten keine Screenshots. (Also wenn ich ein Bild im Clipboard habe)
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#20

Re: Screenshot bei Tastendruck machen und speichern

  Alt 18. Dez 2009, 12:58
Wenn ich in meinem Testproject
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
begin
  Bitmap.Assign(ClipBoard);
  Bitmap.SaveToFile('blubb.bmp');
  ClipBoard.Clear;
end;
mache, wird nach Drücken von "Druck" und Klick auf den Button das Bild gespeichert und anschließend ist das ClipBoard leer. Ohne irgendwelche Fehler.
Hab da jetzt auch keinen Plan, wo bei dir der Fehler herkommt.
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz