Einzelnen Beitrag anzeigen

Alex_ITA01

Registriert seit: 22. Sep 2003
1.069 Beiträge
 
Delphi 10.4 Sydney
 
#1

Screenshot des aktiven Fenster genau wie Alt+Druck

  Alt 2. Okt 2015, 08:48
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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat