![]() |
Screenshot bei Tastendruck machen und speichern
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:
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.
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; Bitte um Hilfe bzw Lösungsvorschläge :D 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 |
Re: Screenshot bei Tastendruck machen und speichern
Kann denn keiner helfen? :(
Also der Error kommt in Zeile
Delphi-Quellcode:
Also denke ich, dass es etwas mit dem Datum zu tun hat, dass er das nicht umsetzen kann.
Bitmap.SaveToFile(aFileName+'.bmp');
Delphi-Quellcode:
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 ;)
ScreenToFile(DateToStr(now)+'_'+TimeToStr(now));
|
Re: Screenshot bei Tastendruck machen und speichern
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) |
Re: Screenshot bei Tastendruck machen und speichern
*Omg*
Stimmt ja :D 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? |
Re: Screenshot bei Tastendruck machen und speichern
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. |
Re: Screenshot bei Tastendruck machen und speichern
Zitat:
Delphi-Quellcode:
Natürlich solltest du noch Ressourcenschutzblöcke verwenden.
JPEGImage := TJPEGImage.Create;
JPEGImage.Assign(Bitmap); JPEGImage.SaveToFile(...); JPEGImage.Free; 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. |
Re: Screenshot bei Tastendruck machen und speichern
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; |
Re: Screenshot bei Tastendruck machen und speichern
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. |
Re: Screenshot bei Tastendruck machen und speichern
Steht die Eigenschaft KeyPreview der Form auf True?
|
Re: Screenshot bei Tastendruck machen und speichern
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 :P KeyPreview hab ich im FormCreate auf true gesetzt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 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