Registriert seit: 1. Feb 2018
3.691 Beiträge
Delphi 11 Alexandria
|
AW: Screenshot like Snipping Tool
16. Okt 2022, 02:44
Das ist doch der Link aus meinem Post
Den habe ich glatt übersehen.
Da ist doch ein Beispiel dabei, in dem das ganze komplett gekapselt verwendet wird.
Ja ich verstehe da nicht wie ich damit umgehen muss, dauert ein wenig bis ich mich da eingearbeitet habe.
Zurzeit habe ich noch DirectX9 eingebaut.
(Mir fällt leider kein Beispiel ein um es vernünftig auszuprobieren da bei mir auch die GDI Variante alles vom Desktop abfotographiert hat, auch Filme in einem Player)
Delphi-Quellcode:
procedure TkzScreenShot.ScreenShotDirectX9(const ALeft, ATop, ARight, ABottom: Integer);
var
BitsPerPixel: Byte;
pD3D: IDirect3D9;
pSurface: IDirect3DSurface9;
g_pD3DDevice: IDirect3DDevice9;
D3DPP: TD3DPresentParameters;
ARect: TRect;
LockedRect: TD3DLockedRect;
BMP: TBitmap;
i, p: Integer;
begin
// MessageBox(0, 'DirectX9', 'DirectX9', MB_OK);
FRect.Left := ALeft;
FRect.Top := ATop;
FRect.Right := ARight;
FRect.Bottom := ABottom;
FImageWidth := FRect.Right - FRect.Left;
FImageHeight := FRect.Bottom - FRect.Top;
BitsPerPixel := GetDeviceCaps(Application.MainForm.Canvas.Handle, BITSPIXEL);
FillChar(d3dpp, SizeOf(d3dpp), 0);
D3DPP.Windowed := True;
D3DPP.Flags := D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
D3DPP.SwapEffect := D3DSWAPEFFECT_DISCARD;
D3DPP.BackBufferWidth := Screen.Width;
D3DPP.BackBufferHeight := Screen.Height;
D3DPP.BackBufferFormat := D3DFMT_X8R8G8B8;
pD3D := Direct3DCreate9(D3D_SDK_VERSION);
pD3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow,
D3DCREATE_SOFTWARE_VERTEXPROCESSING, @D3DPP, g_pD3DDevice);
g_pD3DDevice.CreateOffscreenPlainSurface(Screen.Width, Screen.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, pSurface, nil);
g_pD3DDevice.GetFrontBufferData(0, pSurface);
ARect := FRect;
pSurface.LockRect(LockedRect, @ARect, D3DLOCK_NO_DIRTY_UPDATE or D3DLOCK_NOSYSLOCK or D3DLOCK_READONLY);
BMP := TBitmap.Create;
try
BMP.Width := FImageWidth;
BMP.Height := FImageHeight;
case BitsPerPixel of
8: BMP.PixelFormat := pf8bit;
16: BMP.PixelFormat := pf16bit;
24: BMP.PixelFormat := pf24bit;
32: BMP.PixelFormat := pf32bit;
else
BMP.PixelFormat := TPixelFormat.pfDevice;
end;
p := Cardinal(LockedRect.pBits);
for i := 0 to FImageHeight - 1 do
begin
CopyMemory(BMP.ScanLine[i], Ptr(p), FImageWidth * BitsPerPixel div 8);
p := p + LockedRect.Pitch;
end;
FImageWork := TBitmap.Create;
try
FImageWork.PixelFormat := BMP.PixelFormat;
FImageWork.Width := BMP.Width;
FImageWork.Height := BMP.Height;
FCanvas.Handle := BMP.Canvas.Handle;
if FInverted then
begin
FInverted := False;
FImageWork.Canvas.CopyMode := cmSrcInvert;
end
else
FImageWork.Canvas.CopyMode := cmSrcCopy;
FImageWork.Canvas.CopyRect(
Rect(0, 0, FImageWidth, FImageHeight),
FCanvas,
Rect(0, 0, FImageWidth - 1, FImageHeight - 1));
FImage.ReleaseHandle;
FImage.Assign(FImageWork);
finally
FImage.Dormant;
FImage.FreeImage;
FImageWork.Free;
end;
finally
BMP.Free;
pSurface.UnlockRect;
end;
end;
// edit
Habe nachträglich mal eine Beispielanwendung zum ausprobieren angehangen, sollte alles selbsterklärend sein, so hoffe ich.
(Virus-Total meldet einen (falsch) fund:
Rising
Trojan.Generic@AI.89 (RDMK:cmRtazrbpxF5IptlRljLk8Ec4amq))
Geändert von KodeZwerg (16. Okt 2022 um 07:23 Uhr)
Grund: fixed and updated
|