Autor Beitrag
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Di 03.02.04 23:02 
Hier zwei Tipps wie man man ein ScreenShot eines beliebigen Fensters erstellen kann. Benötigt werden dafür nur das Handle des Fensters. Es muß sich dabei also nicht unbedingt um das eigene Fenster handeln. Man sollte auch bemerken, daß unter Windows vieles eine Fenster ist: ein Formular, ein Button oder z.B. der Desktop.

Nicht unwichtig ist, daß man sich hier selbst darum kümmern sollte vorher das Fenster in den Vordergrund zu bringen. Hier wird nur der Fensterbereich angelichtet, nicht das Fenster selbst. Befindet sich das Fenster im Vordergrund, dann wird das Fenster abgespeichet. Befindet sich etwas davor, dann wird etwas anders abgebildet.


ScreenShot eines Fensters erstellen und speichern:

Hier wird ein ScreenShot erstellt und gespeichert.

Benötigt werden zwei Parameter:
  • Pfad zum speichern der Bitmap
  • Handle des Fenster

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
// *** Erstellt von einem Formular ein ScreenShot ***
function FormularSaveScreenShot(FileName: String; h : hWnd): Boolean;
var
  Rec: TRect;
  iWidth, iHeight: Integer;
begin
  with TBitmap.Create do try
    GetWindowRect(h, Rec);

    iWidth  := Rec.Right - Rec.Left;
    iHeight := Rec.Bottom - Rec.Top;

    Width := iWidth;
    Height := iHeight;

    BitBlt(Canvas.Handle, 00, iWidth, iHeight, GetWindowDC(h), 00, SRCCOPY);

    Result := True;

    try SaveToFile(Filename) except Result := False end;
  finally
    ReleaseDC(h, GetWindowDC(h));
    Free;
  end;
end;


Beispiel:

ScreenShot des eigenen Fensters erstellen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
begin
  FormularSaveScreenShot('c:\formshot.bmp', Handle);
end;



ScreenShot eines Fensters erstellen:

Hier eine Abwandlung der oberen Funktion. Hier wird das Ergebnis nicht gespeichet, sondern in eine Bitmap geladen:

Benötigt werden zwei Parameter:
  • Bitmap als Behälter
  • Handle des Fenster

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
// *** Erstellt von einem Formular ein ScreenShot ***
function FormularScreenShot(Bmp: TBitmap; h : hWnd): Boolean;
var
  Rec: TRect;
  iWidth, iHeight: Integer;
begin
  with Bmp do try
    GetWindowRect(h, Rec);

    iWidth  := Rec.Right - Rec.Left;
    iHeight := Rec.Bottom - Rec.Top;

    Width := iWidth;
    Height := iHeight;

    BitBlt(Canvas.Handle, 00, iWidth, iHeight, GetWindowDC(h), 00, SRCCOPY);

    Result := True;
  finally
    ReleaseDC(h, GetWindowDC(h));
  end;
end;


Beispiel:

ScreenShot eines Buttons erstellen und auf den Formular zeichnen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button1Click(Sender: TObject);
var
  Bmp: TBitmap;
begin
  Bmp := TBitmap.Create;
  try
    FormularScreenShot(Bmp, Button1.Handle);
    Canvas.Draw(2020, Bmp);
  finally
    Bmp.Free;
  end;
end;

_________________
Popov