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..
ScreenShot
gruss