![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать скриншот экрана
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]
> какая разница скольки задачные ОС
Большая)