![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сграбить экран ... ? [D5, D6, D7, Win95/98, WinME, NT4, Win2k, WinXP]
WM.DIGGER © (2004-03-16 08:20:00)Возник вопрос, как сграбить изображение всего экрана и сохранить его в файл?
Вопрос кажется очень простым на первый взгляд и реализуется очень просто:
var DC:HDC;
BMP:TBitMap;
begin
DC := GetDC(0);
BMP := TBitMap.Create;
BMP.Width := Screen.Width;
BMP.Height := Screen.Height;
BMP.PixelFormat := pf24bit;
BitBlt(BMP.Canvas.Handle,0,0,BMP.Width,BMP.Height,DC,0,0,SRCCOPY);
BMP.SaveToFile('имя файлы');
BMP.Free;
ReleaseDC(0,DC);
end;
А вот тут и начинается проблема! Сохраняется изображение всего экрана, НО если работает Windows Media Player, то изображение того что в нём воспроизводиться НЕ СОХРАНЯЕТСЯ!
ВОПРОС:Как сохранить изображение, которое находиться в Windows Media Player'e, т.е. что бы картинка которая находиться в данный момент в WM Player'e сохранялась вместе с изображением остального экрана ?
WM.DIGGER (2004-04-03 15:32:00) [1]to [Dr.Null] нет ни чего невозможного :)))
to [Guest] самы первый пример на странице http://www.geocities.com/krishnapg/screencap.htmlкопирует ВСЁ !!! включая то что в данный момент воспроизводиться в Windows Media Player'е, круто :)))
to [Mihey] логично что если DirectX то надобы юзать именно его :) Однако винды вешь нелогичная :) Все плеера подобные WMP юзают DirectShow это так, однако базовая поверхность на которую кидается изображение (PRIMARY_SURFACE) всё равно связана с хэндлом экрана, тут главное было найти правильный HDC :)
Короче, всем кому интерестно, вот пример на Delphi - грабит весь экран, включая всё что находиться в Windows Media Player'е например ... (на основе http://www.geocities.com/krishnapg/screencap.html)
var RegionWidth,RegionHeight:Integer;
DesktopWnd:HWND;
DesktopDC:HDC;
CaptureBitmap:TBitMap;
begin
RegionWidth := Screen.Width;
RegionHeight := Screen.Height;
DesktopWnd := GetDesktopWindow();
DesktopDC := GetDC(DesktopWnd);
CaptureBitmap := TBitMap.Create;
CaptureBitmap.Width := RegionWidth;
CaptureBitmap.Height := RegionHeight;
CaptureBitmap.PixelFormat := pf24bit;
BitBlt(CaptureBitmap.Canvas.Handle,0,0,RegionWidth,RegionHeight,DesktopDC,0,0,SRCCOPY);
CaptureBitmap.SaveToFile('c:\123.bmp'); // сохраняем :)
CaptureBitmap.Free;
ReleaseDC(DesktopWnd,DesktopDC);
end;
Всем удачи!
Mihey (2004-03-23 23:02:00) [2]Как насчёт Windows Media API по той же ссылке?
Guest (2004-03-23 19:55:00) [3]Да давно интересует нас эта тема...
http://www.geocities.com/krishnapg/screencap.html
работает на уровне get.frontbuffer копируем только часть экрана avi опять в пролете
для копирования Windows Media Player
надо копаться в свойсвах\ directdraw\ отключить перекрытия... и т.д. четыре первых чекбокса и тогда копироваться будет осуществлять api функциями и спомощью direct3d...
Dr.Null (2004-03-16 21:12:00) [4]
> Dr.Null
> на телевизоре видно
> и оверлей тут вообще не при чём
Не хочется оффтопик разводить, но лично у меня на телевизор оверлеи не выводятся.
Mihey (2004-03-16 20:08:00) [5]Если вывод через DirectX -> DirectShow, то вполне логично, что надо использовать DirectX и для копирования экрана. Вот здесь написано, как сделать это в том числе и через DirectX:
http://www.geocities.com/krishnapg/screencap.html
at (2004-03-16 19:26:00) [6]Dr.Null
на телевизоре видно
и оверлей тут вообще не при чём
at (2004-03-16 19:21:00) [7]не только WMPlayer а любой DirectShow вывод не виден
Dr.Null (2004-03-16 19:13:00) [8]ИМХО, это невожможно даже теоретически, PrintScreen'он изображение WMP тоже не снимается. WMP воспроизводит видео в overlay-режиме (чо это такое я и сам не знаю), такие изображение даже не отображаются на телевизоре, подключенном как второй дисплей. Так что (опять же ИМХО), чтобы это сграбить, надо грабить на уровне DirectX (как, не знаю). Если интересует просто снятие скриншотов с видео, то используй BSPlayer, там есть функция снятия скриншотов. А если хочется самому, то отключи в BSPlayer overlay-режим и грабь своей прогой. Может и WMP можно отключить overlay-режим, тока я не знаю как.
Удачи!