Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ich muss für aktuellen Screenshot immer 2x drücken (https://www.delphipraxis.net/142077-ich-muss-fuer-aktuellen-screenshot-immer-2x-druecken.html)

Mariaki 21. Okt 2009 16:57


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:
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;
Um ganzen Prozeduren für den Screenshot auszuweichen, simuliere ich einfach die Druck-Taste.
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

jfheins 21. Okt 2009 17:01

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 ;)

alleinherrscher 21. Okt 2009 17:03

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;

Mariaki 21. Okt 2009 17:19

Re: Ich muss für aktuellen Screenshot immer 2x drücken
 
Danke schon mal.
Aber wie lasse ich das dann in einem Image anzeigen?

DeddyH 21. Okt 2009 17:23

Re: Ich muss für aktuellen Screenshot immer 2x drücken
 
Delphi-Quellcode:
var Bmp: TBitmap;
begin
  Bmp := TBitmap.Create;
  try
    MakeScreenShot(Bmp);
    Image.Picture.Graphic.Assign(Bmp);
  finally
    Bmp.Free;
  end;
end;
Ungetestet

Mariaki 21. Okt 2009 17:29

Re: Ich muss für aktuellen Screenshot immer 2x drücken
 
Da bekomme ich eine Zugrifsverletzung.

DeddyH 21. Okt 2009 17:31

Re: Ich muss für aktuellen Screenshot immer 2x drücken
 
Und wo genau?

Mariaki 21. Okt 2009 17:37

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.

himitsu 21. Okt 2009 18:12

Re: Ich muss für aktuellen Screenshot immer 2x drücken
 
geht denn Image.Picture.Assign(Bmp); nicht?

DeddyH 21. Okt 2009 18:24

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.
Seite 1 von 2  1 2      

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