Добрый день,
Могу предложить в качестве базового способ получения скриншота всего рабочего стола.
1. Делаем скриншота рабочего стола по хендлу:
function MakeWindowScreenShot(const AWindowHandle: HWND): TBitmap;
var
VCLBitmap: TBitmap;
WindowRect: TRect;
begin
VCLBitmap := TBitmap.Create;
try
WindowRect := Rect(0, 0, Screen.DesktopWidth, Screen.DesktopHeight);
VCLBitmap.Width := WindowRect.Width;
VCLBitmap.Height := WindowRect.Height;
BitBlt(VCLBitmap.Canvas.Handle, WindowRect.Left, WindowRect.Top, WindowRect.Width, WindowRect.Height, AWindowHandle, 0, 0, SRCCOPY);
except
VCLBitmap := nil;
end;
Result := VCLBitmap;
end;
2. Далее получаем хендл рабочего стола, делаем скриншот и сохраняем скриншот в файл:
procedure MakeScreenShotOfDesktop(const AFileName: string);
var
DCDesk: HDC;
VCLBitmap: TBitmap;
DesktopWindow: HWND;
begin
DesktopWindow := GetDesktopWindow;
DCDesk := GetWindowDC(DesktopWindow);
try
VCLBitmap := MakeWindowScreenShot(DCDesk);
try
if VCLBitmap <> nil then
VCLBitmap.SaveToFile(AFileName);
finally
VCLBitmap.Free;
end;
finally
ReleaseDC(DesktopWindow, DCDesk);
end;
end;
Соответственно далее, можно от этого отталкиваться и делать копирование только требуемой части рабочего стола (регион, окно). Для этого нужно в строке:
BitBlt(VCLBitmap.Canvas.Handle, WindowRect.Left, WindowRect.Top, WindowRect.Width, WindowRect.Height, AWindowHandle, 0, 0, SRCCOPY);
указывать нужную область копирования.
Либо, продвинутый вариант. Это для конкретного окна находить хендл и делает скриншот только одного окна.