Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сделать скриншот экрана


Страницы:   1 2

Andrewtitoff ©   (2008-03-20 15:07:00) 

Здравствуйте!, у меня такой вопрос:
Как сделать скриншот экрана?, на первый взгляд задача простая, вот только когда я делаю таким образом:

procedure ScreenToJPG(filename:String);
 var
 bm:TBitMap;
 jpg:TJPEGImage;
 begin
 bm:=TBitMap.Create;
 bm.Width:=Screen.Width;
 bm.Height:=Screen.Height;
 BitBlt(bm.Canvas.Handle,0,0,bm.Width,bm.Height,GetDC(0),0,0,SRCCOPY);
 jpg:=TJPEGImage.Create;
 jpg.Assign(bm);
 jpg.SaveToFile(filename);
 jpg.Free;
 bm.Free;
 end;

то у меня на нем неотображается одна из форм(которая StayOnTop) и я предпологаю что при таком способе изображения из видеоплееров тоже небудет отображаться..., а нельзя ли это как нибудь сделать через видеопамять, помнится когдато давно на Паскале (правда в текстовом режиме) очень просто делалось через память, т.е. описывалиль массивы типа page0, page1, и т.д. размером в один экран по абсолютному адресу и потом уже ими манипулировали, это было очень удобно например сто бы при прорисовке окошек особенно на заднем плане изображение не моргало отрисовывалось просто все на невидимой области видеопамяти, скажем page1, а затем page0:=page1 и вуаля!...

Так вот не подскажите ли как сделать примерно тоже самое в дельфи и в графическом режиме, т.е. тупо порсто взять участок видеопамяти который отображается на мониторе и сохранить его в TBitmap  ?


Andrewtitoff   (2008-03-21 11:34:00) [1]

Эх..., ну я так и сделал...


procedure TgsCatcher.DoGenerateScreenshot;
var bmp: TBitmap;
   jpg: TJPEGImage;
    c : integer;
begin
if Not DirectoryExists(MD+'\error\'+fn) then CreateDir(MD+'\error\'+fn);

    with Screen do
   for c := 0 to CustomFormCount-1 do
     if Forms[c].Visible then
 //  bmp := Screen.ActiveForm.GetFormImage;  ваыва
 begin
   bmp := CustomForms[c].GetFormImage;
   jpg := TJPEGImage.Create;
   jpg.CompressionQuality := 100;
   jpg.Assign(bmp);
   jpg.SaveToFile(MD+'\error\'+fn+'\'+fn+Format('%.3d',[c])+'.jpg');
   FreeAndNil(jpg);
   FreeAndNil(bmp);
 end;

end;{}


Плохиш   (2008-03-20 17:49:00) [2]


> Andrewtitoff ©   (20.03.08 17:26) [28]
> Так и что делать?, как мне сделать что бы грабились хотя
> бы все видимые в данный момент формф моего приложения в
> таком виде - в каком они есть?,

TCustomForm.GetFormImage не поможет "отцу русской демократии"?


Palladin   (2008-03-20 17:39:00) [3]

и координаты окон есть на экране, left и top называются


Palladin   (2008-03-20 17:38:00) [4]


> Мля..., ты хоть сам то смотрел что там "google + как сделать
> скриншот экрана", или тебе вопрос до конца лень дочитать?
> ..., везде приводятся примеры на подобии того что я привел,
>  а я спрашитваю про видеопамять...

мля, ну добавь ключевое слово оверлей и WMR9 и поковыряй, очень позновательное занятие...


> Мало того - на экране запросто могут присутствовать и не
> только твои формы.

плюс еще и тивитюнеры всякие...


> Andrewtitoff ©   (20.03.08 17:26) [28]

так создай bmp, отрисуй туда все формы свои, в порядке z-ордера, они же твои, и у них канвас есть...


Andrewtitoff   (2008-03-20 17:27:00) [5]

Хотя таким способом форма отображается без прозрачностей и с фоном, который прозрачен(как при проектировании формы...)


Andrewtitoff   (2008-03-20 17:26:00) [6]

Так и что делать?, как мне сделать что бы грабились хотя бы все видимые в данный момент формф моего приложения в таком виде - в каком они есть?,
с активной формой понятно:
bmp := Screen.ActiveForm.GetFormImage;,
с какой нибудь одной другой тоже:
bmp := Screen.Forms[n].GetFormImage;
А все видимые как они есть?...


Сергей М.   (2008-03-20 17:16:00) [7]


> у меня половина прозрачных


Мало того - на экране запросто могут присутствовать и не только твои формы.
Например, переднеплановое окно оверлея медиаплейера, воспроизводящего в этот момент видео, интересует оно тебя или не интересует)


Andrewtitoff   (2008-03-20 17:10:00) [8]

2 Sapersky
Ну в принципе конечно мне видео и неинчересует..., вот олько как я понял что BitBlt не с правляется с формами у которых прозрачность...  =(((
А у меня половина прозрачных....


Сергей М.   (2008-03-20 16:55:00) [9]


> Между DirectX и DelphiX есть разница


Те же фаберже, только вид сбоку)


Sapersky   (2008-03-20 16:53:00) [10]

А что нить вроде DelphiX поможет?

Скорее уж DirectDraw, но по большому счёту не поможет.
Пресловутый "page0" получить можно, но особого смысла в этом нет - с формами, теоретически, должен справляться BitBlt, а медиаплеер таким образом всё равно не захватить (это отдельная и весьма нетривиальная задача).


Kolan   (2008-03-20 16:47:00) [11]

Между DirectX и DelphiX есть разница… :)


Сергей М.   (2008-03-20 16:46:00) [12]

Если в DirectX найдешь что-либо похожее на DirectScreenShot или DirectScreenGrab, то вероятно поможет)


Andrewtitoff   (2008-03-20 16:43:00) [13]

2 Сергей М.
А что нить вроде DelphiX поможет?


ANB   (2008-03-20 16:38:00) [14]


> Неужели все так сложно, мне же ничего кроме участка памяти
> ненадо...

Участок памяти уже давно не поможет. У твоего процесса - 4Гига собственного адресного пространства. И куда бы ты ни писал в нем - ты не знаешь, куда физически все это запишется (в ОЗУ или на винт).


Сергей М.   (2008-03-20 16:37:00) [15]


> Неужели все так сложно


Почему сложно ?
Нужно просто написать ДРЯ или воспользоваться любым подходящим готовым)


ANB   (2008-03-20 16:37:00) [16]


> И какая разница скольки задачные ОС, видеопамять то она
> есть и определенный ее участок все время отображается на
> мониторе, а все остальное предрассудки язычников высокого
> уровня...  =)))

Еще под ДОС начались проблемы с SVGA, которую не успели стандартизировать. До VGA включительно, код, который работал с видеопамятью напрямую, работал практически на всех компах (есно, нужного типа видеоадаптера). Дальше же начался разброд. На современных видюхах доступ к видеопамяти не стандартизирован (только для старых режимов). Вместо этого производитель поставляет драйвер со стандартизированным интерфейсом. Через него все и работают. И это хорошо.
В принципе, помудохавшись, мона написать прямую работу с видюхой и под современными ОС. Только с большой вероятностью программа будет работать только на твоем компе. Ну или на компах с точно такой же видюхой. Так что овчинка выделки не стоит.


Andrewtitoff   (2008-03-20 16:36:00) [17]

Неужели все так сложно, мне же ничего кроме участка памяти ненадо...


Kolan   (2008-03-20 16:33:00) [18]

Можно добраться много до чего, но придется писать драйвер, осилишь?


Andrewtitoff   (2008-03-20 16:31:00) [19]

Ну ладно.., конечно большая, зачем к словам то придираться?, но до памяти то все равно можно добраться...


Сергей М.   (2008-03-20 16:26:00) [20]


> какая разница скольки задачные ОС


Большая)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо