Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#18

AW: Wie mache ich einen screenshot in Z-Order mit PrintWindow-API?

  Alt 28. Apr 2019, 02:25
Zitat:
OK! Ich bin raus aus dem Thread.
Hätte ich schon aber den Quelltext meiner Bibliothek gebe ich nicht heraus. Sorry.
Siehe Shot so muss ein ScreenShot aussehen und alles wiedergeben was Original auf dem Desktop sichtbar ist.

Das kann ich dir geben wenn du damit klar kommst.

Delphi-Quellcode:
procedure ScreenCaptureToBackground;
var
  Width, Height: Integer;
  hDeskTop: HWND;
  hDCSrce: HDC;
  pBits: PByte;
  bm: BITMAP;
  p: Integer;
  GIDC: HDC;
begin

  Width := GetSystemMetrics(SM_CXSCREEN);
  Height := GetSystemMetrics(SM_CYSCREEN);

  GIDC := gSprCtrl.GI_CreateImageBackground(HSprCtrl, Width, Height);

  hDeskTop := GetDesktopWindow;
  hDCSrce := GetWindowDC(hDeskTop);

  BitBlt(GIDC, 0, 0, Width, Height, hDCSrce, 0, 0, SRCCOPY);

  FillChar(bm, sizeof(bm), 0);
  GetObject(GetCurrentObject(GIDC, OBJECT_BITMAP), sizeof(bm), @bm);

  pBits := bm.bmBits;
  for p := (bm.bmWidth * bm.bmHeight) - 1 downto 1 do
  begin
    pBits[3] := 255;
    pBits := pBits + 4;
  end;

  ReleaseDC(hDeskTop, hDCSrce);
end;
GI_CreateImageBackground erstellt ein 32Bit Bitmap über "CreateDIBSection"


bsp.
GI_CreateImageBackground(HSprCtrl, Width, Height);

Delphi-Quellcode:
function gCreateDIBSection(DC: HDC; Width, Height, BitCount: Integer): HBitmap;
var
  bi: TBitmapInfo;
  lpBitmapBits: Pointer;
begin

  // Fill in the BITMAPINFOHEADER
  bi.bmiHeader.biSize := sizeof(BITMAPINFOHEADER);
  bi.bmiHeader.biWidth := Width;
  bi.bmiHeader.biHeight := Height;
  bi.bmiHeader.biPlanes := 1;
  bi.bmiHeader.biBitCount := Word(BitCount);
  bi.bmiHeader.biCompression := BI_RGB;
  bi.bmiHeader.biSizeImage := 0;
  bi.bmiHeader.biXPelsPerMeter := 0;
  bi.bmiHeader.biYPelsPerMeter := 0;
  bi.bmiHeader.biClrUsed := 0;
  bi.bmiHeader.biClrImportant := 0;

  Result := CreateDIBSection(DC, bi, DIB_RGB_COLORS, lpBitmapBits, 0, 0);
end;
macht folgendes..
Delphi-Quellcode:
DC := GetDC(HSprCtrl);
hDCSrc := CreateCompatibleDC(DC);

hDIB := gCreateDIBSection(hDCSrc, Width, Height, 32);
// Ich speicher das HBitmap in meine Propertys und hole sie im PaintEvent mit GI_GetProperty zurück.
// Dafür musst du eine andere Lösung finden..
GI_SetProperty(HSprCtrl, GI_Bitmap, LONG_PTR(hDIB));
SelectObject(hDCSrc, hDIB);
// Ich speicher den Source DC in meine Property und hole sie im PaintEvent mit GI_GetProperty zurück.
// Dafür musst du eine andere Lösung finden..
GI_SetProperty(HSprCtrl, GI_DC, LONG_PTR(hDCSrc));
ReleaseDC(HSprCtrl, DC);

Result := hDCSrc;
Das Ergebnis siehst du auf dem Shot!
PS:
Nebenbei die ZOrder scheint dich nicht wirklich zu interessieren warum dann der ganze Aufwand?
Ein einfaches ScreenShot Programm sollte dann ausreichend sein dafür gibt es hier genug Beispiele.. Hier im Forum suchenScreenShot

gruss

Geändert von EWeiss ( 9. Jul 2019 um 08:32 Uhr)
  Mit Zitat antworten Zitat