Ja und das habe ich versucht.
Delphi-Quellcode:
procedure TForm1.btnCaptureClick(Sender: TObject);
var
Surface: IDirect3DSurface9;
SurfaceDest: IDirect3DSurface9;
ARect: TRect;
DestRect: TRect;
Mode: D3DDISPLAYMODE;
p: TPoint;
begin
CaptureX.FDevice.GetDisplayMode(0, Mode);
//Source
if (CaptureX.FDevice.CreateOffscreenPlainSurface(
Mode.Width,
Mode.Height, D3DFMT_A8R8G8B8,
D3DPOOL_SCRATCH, Surface, nil) = S_OK) then
begin
CaptureX.FDevice.GetFrontBufferData(0, Surface);
ARect := clientRect;
P := ClientToScreen(Point(clientrect.Left, clientrect.Top));
SetRect(ARect, p.x, p.y, p.x + ARect.right, p.y + ARect.bottom);
DestRect.Left := 0;
DestRect.Top := 0;
DestRect.Right := 64;
DestRect.Bottom := 48;
// Dest
CaptureX.FDevice.CreateOffscreenPlainSurface(
DestRect.Right,
DestRect.Bottom, D3DFMT_A8R8G8B8,
D3DPOOL_SCRATCH, SurfaceDest, nil);
CaptureX.FDevice.GetFrontBufferData(0, SurfaceDest);
CaptureX.FDevice.StretchRect(Surface, @ARect, SurfaceDest, @DestRect, D3DTEXF_NONE);
D3DXSaveSurfaceToFileW('D:\paper.bmp', D3DXIFF_BMP, Surface, nil, @DestRect);
end;
Timer1.Enabled := False;
end;
Neues Surface erstellt und dann versucht vom source ins dest zu kopierrn.
Es gab zwar ein Bild aber 64x48 vom Desktop an der 0,0 Position (siehe Anhang)
hab auch UpdateSurface getestet
Zitat:
Copies rectangular subsets of pixels from one surface to another.
Muss weiter probieren
Irgendwas scheint da wieder zu fehlen
gruss