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 1 von 3  1 23      
gasty

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

Screenshot bei Tastendruck machen und speichern

  Alt 16. Dez 2009, 18:49
Hi,
also ich habe nun versucht, ein Programm zu schreiben, welches die Tasten überwacht, und wenn man Druck drückt, einen Screenshot macht, ihn mit Datum und Zeit deklariert und abspeichert.
In der Theorie klappt das auch einwandfrei, doch leider in der Praxis nicht...
Hier mal mein Code:
Delphi-Quellcode:
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;

        BitBlt(Bitmap.Canvas.Handle, 0, 0, Pred(Screen.DesktopWidth), Pred(
            Screen.DesktopHeight), Canvas.Handle, Screen.DesktopLeft,
            Screen.DesktopTop, Bitmap.Canvas.CopyMode);
        Bitmap.SaveToFile(aFileName+'.bmp');
      finally
        Bitmap.Free;
      end;
    finally
      ReleaseDC(0, Canvas.Handle);
    end;
  finally
    Canvas.Free;
  end;
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
   if Key = #44 then
      ScreenToFile(DateToStr(now)+'_'+TimeToStr(now));
end;
So, nun erstens das Problem, dass das Programm den KeyPress nicht erkennt, zweitens spuckt mir das Programm einen Error (Falscher Parameter) aus, wenn ich die Prozedur in einem Button abrufe.
Bitte um Hilfe bzw Lösungsvorschläge

PS: Am besten wäre es dann noch, wenn ich das Programm in die Tray Leiste setzen könnte, aber das hab ich jetz noch nicht angefangen zu coden, würde mich trotzdem über einen Ansatz freuen.

Gruß,
gasty
  Mit Zitat antworten Zitat
gasty

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

Re: Screenshot bei Tastendruck machen und speichern

  Alt 17. Dez 2009, 20:03
Kann denn keiner helfen?
Also der Error kommt in Zeile Bitmap.SaveToFile(aFileName+'.bmp'); Also denke ich, dass es etwas mit dem Datum zu tun hat, dass er das nicht umsetzen kann. ScreenToFile(DateToStr(now)+'_'+TimeToStr(now)); Und das mit dem KeyPress verstehe ich nicht, wieso er das nicht erkennt, ist bestimmt ein dummer Fehler von mir nur leider findet man die einfachsten Sachen meist nie
  Mit Zitat antworten Zitat
Progman

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

Re: Screenshot bei Tastendruck machen und speichern

  Alt 17. Dez 2009, 20:11
DateToStr und TimeToStr liefern (m.W.) sowas "11.12.2009" und "14:22". Da hast du Punkte und einen Doppelpunkt im Dateinamen. Das mag Windows nicht
FormatDateTime('yyyy-mm-dd_hh-nn-ss',Now) wäre eventuell günstiger?
(das Jahr als erstes, um die Dateien nach exaktem Datum sortiert anzeigen zu können)
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
 
#4

Re: Screenshot bei Tastendruck machen und speichern

  Alt 17. Dez 2009, 20:15
*Omg*
Stimmt ja
Danke, jetzt klappt das auch.
Das Problem mit dem nicht erkannten KeyPress besteht jedoch weiterhin :/


Und gibt es einen Weg, die Datei gleich in eine jpeg umzuwandeln, da ~7mb pro Screen dann doch etwas viel sind?
  Mit Zitat antworten Zitat
Progman

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

Re: Screenshot bei Tastendruck machen und speichern

  Alt 17. Dez 2009, 20:34
KeyPress klappt bei den Systemtasten nicht richtig.
Pack das mal in OnKeyDown, da ist dann Key auch vom Typ Word, und nicht Char. Das müsste dann klappen.
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
Namenloser

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

Re: Screenshot bei Tastendruck machen und speichern

  Alt 17. Dez 2009, 20:37
Zitat von gasty:
Und gibt es einen Weg, die Datei gleich in eine jpeg umzuwandeln, da ~7mb pro Screen dann doch etwas viel sind?
Binde die Unit "jpeg" ein (weiß nicht, ob die bei Delphi 7 schon dabei ist, wenn nicht, musst du sie erst runterladen). Dann konvertierst du das Bild vorm Speichern in ein TJPEGImage:
Delphi-Quellcode:
JPEGImage := TJPEGImage.Create;
JPEGImage.Assign(Bitmap);
JPEGImage.SaveToFile(...);
JPEGImage.Free;
Natürlich solltest du noch Ressourcenschutzblöcke verwenden.

Allerdings dazu noch etwas von meinem Senf: JPEG halte ich als Kompressionsformat aufgrund der Artefakte für Screenshots als weniger geeignet. PNG ist eigentlich derzeit IMO das optimale Format (*) für Screenshots (solange es sich nicht um Screenshots von Videos oder grafikintesniven Spielen handelt, natürlich). PNGs lassen sich mit Delphi eigentlich genau so einfach verarbeiten wie JPEGs, nur dass die Unit pngimage und die Klasse TPNGObject heißt.

(*) Wenn man mal von dem sehr wenig verbreiteten JPEG-2000-Format absieht, das nach meiner Erfahrung noch etwas bessere Kompressionsraten hat.
  Mit Zitat antworten Zitat
gasty

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

Re: Screenshot bei Tastendruck machen und speichern

  Alt 17. Dez 2009, 20:45
Ok, danke, das mit jpg klappt jetzt auch.
Nur immernoch das Problem mit dem Key.
Habs jetzt mal in ein KeyDown geschrieben, aber gleicher Effekt. (Btw. Welche Taste ist denn DRUCK? VK_PRINT oder VK_SNAPSHOT? Hab zwar beide probiert und keine klappt, aber würds mal gerne eindeutig wissen, irgendwie stehen immer diese beiden da)
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   if Key = VK_PRINT then
      ScreenToFile(FormatDateTime('yyyymmddhhnnss',Now))
end;
  Mit Zitat antworten Zitat
Progman

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

Re: Screenshot bei Tastendruck machen und speichern

  Alt 17. Dez 2009, 20:49
Welchen Tasten-Code die Drucktaste hat, weiß ich jetzt nicht aus dem Kopf.
Schreib doch mal ins OnKeyDown zusätzlich: ShowMessage(IntToStr(Key)):
Dann siehst du, welchen numerischen Wert die Druck-Taste liefert. ( So kann man auch alle anderen Tasten rauskriegen )
Dann vergleich einfach mit den Zahlenwert statt der VK-Konstanten.
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
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Screenshot bei Tastendruck machen und speichern

  Alt 17. Dez 2009, 20:53
Steht die Eigenschaft KeyPreview der Form auf True?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
gasty

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

Re: Screenshot bei Tastendruck machen und speichern

  Alt 17. Dez 2009, 20:54
Ok, das ist jetz komisch... Die Druck taste spuckt keinen Wert aus oO
Dann nehm ich eben Rollen, das ist die 145.
Muss ich die dann noch in Word umwandeln, wenn in den numerischen Wert nehmen will im KeyDown?
Weil KeyPress funktioniert ja nicht richtig.

Und sorry nochmal für die doofen Fragen aber hab lange nichts mehr geschrieben in Delphi

KeyPreview hab ich im FormCreate auf true gesetzt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 19:43 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