Получение скриншота экрана
Модератор: Модераторы
Получение скриншота экрана
Как сделать скриншот экрана в *nix системах (как делает VNC сервер)?
Интересует не только xorg, но и wayland (если есть разница, а она наверное есть).
При этом хотелось бы учесть, что у пользователя может быть запущено видео (плеер или браузер).
Интересует не только xorg, но и wayland (если есть разница, а она наверное есть).
При этом хотелось бы учесть, что у пользователя может быть запущено видео (плеер или браузер).
Гугл говорит
Код: Выделить всё
procedure TForm1.Button4Click(Sender: TObject);
var MyBitmap:Graphics.TBitmap;
ScreenDC:LCLType.HDC;
WrkJpg:TJpegImage;
begin
MyBitmap:=Graphics.TBitmap.Create;
ScreenDC:=LCLIntf.GetDC(0);
MyBitmap.LoadFromDevice(ScreenDC);
//Per avere un elenco dei vari formati disponibili (png, bmp, xmp, ecc.):
//http://wiki.lazarus.freepascal.org/Developing_with_Graphics#Image_formats
WrkJpg:=TJpegImage.Create;
try
WrkJpg.Assign(MyBitmap);
WrkJpg.SaveToFile(Utf8ToSys(WinTemp + 'Mario.jpg'));
finally
FreeAndNil(WrkJpg);
end;
LCLIntf.ReleaseDC(0 , ScreenDC);
FreeAndNil(MyBitmap);
end;в дополнение к приведенному коду: у меня даже в демках готовый проект валялся


- Вложения
-
- project1.zip
- (127.39 КБ) 523 скачивания
В винде работает так :
Если WindowHD равно нулю захватывает весь экран, а если подставить реальный Handle окна только его (причем неважно перекрыто ли оно другим окнами или нет лишь бы не свернуто )
Код: Выделить всё
function TCaptureForm.CreateSnapshot ( WindowHD : HWND ):TBitmap;
var
wnd:HWND;
dc:HDC;
Bmp:TBitmap;
r:TRect;
begin
Bmp:=TMP;
wnd :=WindowHD;
if wnd = 0 then
begin
dc := GetDC(0);
Bmp := TBitmap.Create;
Bmp.SetSize (Screen.Width,Screen.Height);
end
else
begin
Bmp := TBitmap.Create;
dc := GetWindowDC(wnd);
GetWindowRect(wnd,r);
Bmp.SetSize(r.Right-r.Left,r.Bottom-r.Top);
end;
BitBlt(Bmp.Canvas.Handle,0,0,Bmp.Width,Bmp.Height,DC,0,0,SRCCOPY);
Result:= bmp;
ReleaseDC(wnd,dc);
end;
Если WindowHD равно нулю захватывает весь экран, а если подставить реальный Handle окна только его (причем неважно перекрыто ли оно другим окнами или нет лишь бы не свернуто )
Alex2013
имхо, лучше пользовать кроссплатформенный способ. Он к тому же и проще.
имхо, лучше пользовать кроссплатформенный способ. Он к тому же и проще.
Пользовался вот такой процедурой:
Формат сохраняемой картинки определяется по расширению файла. Бросит исключение, если формат не поддерживается.
Код: Выделить всё
procedure Screen2File(const aFileName: string);
var
dc: HDC;
begin
dc := LclIntf.GetDC(0);
try
with TPicture.Create do
try
Bitmap.LoadFromDevice(dc);
SaveToFile(aFileName);
finally
Free;
end;
finally
LclIntf.ReleaseDC(0 , dc);
end;
end;
Формат сохраняемой картинки определяется по расширению файла. Бросит исключение, если формат не поддерживается.
zoltanleo писал(а):Alex2013
имхо, лучше пользовать кроссплатформенный способ. Он к тому же и проще.
Так как раз запись скриншота экрана (с нулевым хамбелом ) по моему вполне себе кросс-платформенная....
А вот "выкусывание" конкретного окна кажется нет, но штука реально полезная.
Но да так действительно проще.
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
MyBitmap: TBitmap;
ScreenDC: HDC;
begin
MyBitmap:= TBitmap.Create;
try
ScreenDC:= GetDC(0);
try
MyBitmap.LoadFromDevice(ScreenDC);
finally
ReleaseDC(0,ScreenDC);
end;
Image1.Picture.Assign(MyBitmap);
finally
FreeAndNil(MyBitmap);
end;
end;
Спасибо, за код попробую !
ЗЫ
Кстати интересно, а для линукса аналог "снятия скринов окон" есть ? Нет понятно, что в GetDC нужно подставить хембел окна, но как его получить (особенно для "чужого" окна )?
Alex2013 писал(а):Нет понятно, что в GetDC нужно подставить хембел окна, но как его получить
А TForm.Handle это по-твоему что?
iskander писал(а):Alex2013 писал(а):Нет понятно, что в GetDC нужно подставить хембел окна, но как его получить
А TForm.Handle это по-твоему что?
TForm.Handl это для "своих" окон, а интересны в первую очередь "чужие" !
Есть например такое окно...

... и нужно получить что-то вроде этого.

GetDC(0) - получение хендла основного окна (если память не изменяет, и выше уже скидывали пример)
Насколько я помню, там ещё функции есть, существует окно или нет. Можете методом перебора всё сделать. Но насколько я помню, надо получить хендл основного окна, убрать своё окно, сделать скрин, восстановить своё окно. Ну и сохранить.
Кстати, читайте книжки, Флёнов у себя делал скрины, насколько я помню.
Насколько я помню, там ещё функции есть, существует окно или нет. Можете методом перебора всё сделать. Но насколько я помню, надо получить хендл основного окна, убрать своё окно, сделать скрин, восстановить своё окно. Ну и сохранить.
Кстати, читайте книжки, Флёнов у себя делал скрины, насколько я помню.
Alex2013 писал(а):а интересны в первую очередь "чужие" !
Для любителей чужих окон в винде есть EnumWindows/EnumChildWindows.
iskander писал(а):Для любителей чужих окон в винде есть EnumWindows/EnumChildWindows.
В винде (как видно на скрине ) я более или менее разобрался.
(Правда читал что есть способ через PrintWindows добраться и до свернутых окно - вот это пока "не взлетело" .
