Hallo zusammen,
ich erstelle wie folgt ein Screenshot eines Fensters:
Delphi-Quellcode:
var
aFormat : Word;
aBMP : TBitMap;
AData : THandle;
APalette : HPALETTE;
procedure ScreenShot(Wnd: HWND; ATo: TBitmap);
var
hDCMem : HDC;
DC : HDC;
rect : TRect;
bmp : HBITMAP;
hOld : HGDIOBJ;
begin
hDCMem := CreateCompatibleDC(0);
GetWindowRect(Wnd, rect);
DC := GetDC(Wnd);
bmp := CreateCompatibleBitmap(
DC, rect.Right-rect.Left, rect.Bottom-rect.Top);
ReleaseDC(Wnd,
DC);
hOld := SelectObject(hDCMem, bmp);
SendMessage(wnd, wm_Print, hDCMem, PRF_CHILDREN
or PRF_CLIENT
or PRF_ERASEBKGND
or PRF_NONCLIENT
or PRF_OWNED);
SelectObject(hDCMem, hold);
DeleteObject(hDCMem);
ATo.FreeImage;
ATo.Handle := bmp;
end;
begin
aBMP := TBitmap.Create;
try
ScreenShot(Self.Handle, aBMP);
//<- Self.Handle ist meine "Form1"
// Bild in Zwischenablage
aBMP.SaveToClipBoardFormat(aFormat, AData, APalette);
ClipBoard.SetAsHandle(aFormat,AData);
finally
aBMP.Free;
end;
Das funktioniert auch soweit.
Nur wenn ich eine zweite Form über diese Form1 lege und dann den Screenshot mache, dann wird nur von der Form1 der Screenshot erstellt aber das was von Form2 in dem sichtbaren Bereich der Form1 ist, wird nicht mitgenommen. Also die Funktion sollte so sein, wie Alt+PrintScreen. Da wird ja einfach das aktuelle Fenster ge-screenshot-et bis zum jeweiligen Rahmen. Auch wenn andere Fenster in dem sichtbaren Bereich rein ragen, wird eben deren Ausschnitt auch genommen.
Habt ihr eine Idee, wie man genau das macht? Oder kann ich einfach die Tastenkombination Alt+PrintScreen als Command abschicken, das würde mir auch reichen.
Grüße