![]() |
Ich muss für aktuellen Screenshot immer 2x drücken
Hi,
ich hab vor einen Screenshot zu machen und ihn dann anzuzeigen lassen/ zu speichern. Dazu habe ich folgenden Quelltext gemacht:
Delphi-Quellcode:
Um ganzen Prozeduren für den Screenshot auszuweichen, simuliere ich einfach die Druck-Taste.
procedure TForm1.Button1Click(Sender: TObject);
begin keybd_event(VK_SNAPSHOT, 0, 0, 0); keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0); if Clipboard.HasFormat(CF_BITMAP) then begin Image1.Picture.Bitmap.Assign(Clipboard); end; end; Nun wird aber immer der alte Screenshot (von dem davor) angezeigt. D.h.: 1. Nichts passiert, da scheinbar kein Screenshot im Zwischenspeicher ist. 2. Screenshot vom 1. mal wird angezeigt, falls sich also etwas verändert hat ist das noch nicht drin. 3. Screenshot vom 2. mal wird angezeigt. Usw. Dies ist ein wenig dumm, da ich den Screenshot ja schon beim ersten mal haben möchte. Ich habe schon versucht, es einfach zu verdoppeln, also 2x "keyboard_event...end;". Außerdem hab ich versucht mittels "Sleep(10000)" eine Verzögerung dazwischen zu bekommen, falls der Screenshot ein wenig Bearbeitung benötigt. Hat aber beides nicht funktioniert. Ich hoffe einer von euch hat eine Lösung. Gruß Mariaki |
Re: Ich muss für aktuellen Screenshot immer 2x drücken
Ganz einfach: Die Screenshot-Taste muss ja auch erstmal behandelt und (infolge dessen) ein Screenshot gemacht werden. Du sendest einfach nur das Event, das kommt dann in die Queue und wird bei Gelegenheit verarbeitet ;)
Bessere Lösung (die außerdem nicht die Zwischenablage missbraucht und den vorherigen Inhalt löscht) wie folgt: mit GetDesktopWindow() und GetDC() den DC besorgen und mit BitBlt in ein Bitmap (TBitmap Objekt) kopieren ;) |
Re: Ich muss für aktuellen Screenshot immer 2x drücken
Hm, stell dir mal folgenden Fall vor:
Dein Programm läuft - warum auch immer - im Hintergrund und der User sucht im Internet etwas bei Wikipedia raus. Dort kopiert er eine Grafik und möchte sie in Word einfügen. Zufällg macht dein Programm in diesem moment ein screenshot und der werte User bekommt dann in Word nicht die Grafik angezeigt sondern seinen eigenen Bildschirm...nicht so toll oder? Benutze lieber:
Delphi-Quellcode:
procedure MakeScreenShot(const ATarget: TBitmap);
var DesktopDC: HDC; begin DesktopDC := CreateDC('DISPLAY', nil, nil, nil); try ATarget.PixelFormat := pfDevice; ATarget.Width := Screen.Width; ATarget.Height := Screen.Height; BitBlt(ATarget.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, DesktopDC, 0, 0, SRCCOPY); finally DeleteDC(DesktopDC); end; end; |
Re: Ich muss für aktuellen Screenshot immer 2x drücken
Danke schon mal.
Aber wie lasse ich das dann in einem Image anzeigen? |
Re: Ich muss für aktuellen Screenshot immer 2x drücken
Delphi-Quellcode:
Ungetestet
var Bmp: TBitmap;
begin Bmp := TBitmap.Create; try MakeScreenShot(Bmp); Image.Picture.Graphic.Assign(Bmp); finally Bmp.Free; end; end; |
Re: Ich muss für aktuellen Screenshot immer 2x drücken
Da bekomme ich eine Zugrifsverletzung.
|
Re: Ich muss für aktuellen Screenshot immer 2x drücken
Und wo genau?
|
Re: Ich muss für aktuellen Screenshot immer 2x drücken
Ah.. danke schon selbst gefunden:
Man muss anstatt "Image.Picture.Graphic.Assign(Bmp);" "Image.Picture.Bitmap.Assign(Bmp);" nehmen da es ja ne Bitmap ist. Jo.. danke an alle. |
Re: Ich muss für aktuellen Screenshot immer 2x drücken
geht denn Image.Picture.Assign(Bmp); nicht?
|
Re: Ich muss für aktuellen Screenshot immer 2x drücken
Müsste, ich hatte ja auch nur so aus dem Kopf getippt.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 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