Текущий архив: 2008.04.13;
Скачать: CL | DM;
ВнизКак сделать скриншот экрана Найти похожие ветки
← →
Andrewtitoff © (2008-03-20 15:07) [0]Здравствуйте!, у меня такой вопрос:
Как сделать скриншот экрана?, на первый взгляд задача простая, вот только когда я делаю таким образом:
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 ?
← →
Johnmen © (2008-03-20 15:08) [1]С чего ты взял, что в видеопамяти лежит TBitmap? :)))
← →
Andrewtitoff © (2008-03-20 15:11) [2]Мля..., да я и не говорил что он там лежит..., я спрашиваю как его туда засунуть....
← →
Andrewtitoff © (2008-03-20 15:11) [3]Точнее не его туда, а ее в него...
← →
Johnmen © (2008-03-20 15:19) [4]Может почитать чего?
Напр.
http://www.delphisources.ru/pages/faq/base/click_print_screen.html
← →
Palladin © (2008-03-20 15:25) [5]google + как сделать скриншот экрана
на каждом углу...
← →
Andrewtitoff © (2008-03-20 15:37) [6]2 Palladin
Мля..., ты хоть сам то смотрел что там "google + как сделать скриншот экрана", или тебе вопрос до конца лень дочитать?..., везде приводятся примеры на подобии того что я привел, а я спрашитваю про видеопамять...
2 Johnmen
Ты сам то смотрел что там в ссылке которую ты дал?, или тебе тоже лень внимательно вопрос прочитать?...
Хороше, поставлю вопрос более конкретно:
Как взять видимый на мониторе участок видеопамяти и засунуть его в TBitmap?
← →
Johnmen © (2008-03-20 15:40) [7]Ты ещё чуть-чуть помлякай, глядишь и ответит кто...
← →
Сергей М. © (2008-03-20 15:40) [8]
> помнится когдато давно на Паскале (правда в текстовом режиме)
> очень просто делалось через память
Вспомнила бабушка как девушкой была)
На дворе уже давно многозадачные ОС)
← →
Плохиш © (2008-03-20 15:43) [9]
> Сергей М. © (20.03.08 15:40) [8]
Помог, называется :-)) А кодер так на тебя надеялся...
← →
Сергей М. © (2008-03-20 15:52) [10]
> Плохиш © (20.03.08 15:43) [9]
)
Мне что ж, лекцию о драйверах режима ядра нужно было прочитать ?)
← →
Andrewtitoff © (2008-03-20 15:57) [11]2 Плохиш
Аха... =)))
2 Сергей М.
Ну так то оно так, только железо то принципиально не изменилось.., и видеопамять как была - так и осталась, а следовательно до нее как то можно добраться..., ниужели нельзя прочитать содержимое участка памяти?... =)))
← →
Andrewtitoff © (2008-03-20 15:59) [12]2 Сергей М.
И какая разница скольки задачные ОС, видеопамять то она есть и определенный ее участок все время отображается на мониторе, а все остальное предрассудки язычников высокого уровня... =)))
← →
Kolan © (2008-03-20 16:09) [13]Ну так делай как делал на паскале, раз разницы нет…
← →
Сергей М. © (2008-03-20 16:26) [14]
> какая разница скольки задачные ОС
Большая)
← →
Andrewtitoff © (2008-03-20 16:31) [15]Ну ладно.., конечно большая, зачем к словам то придираться?, но до памяти то все равно можно добраться...
← →
Kolan © (2008-03-20 16:33) [16]Можно добраться много до чего, но придется писать драйвер, осилишь?
← →
Andrewtitoff © (2008-03-20 16:36) [17]Неужели все так сложно, мне же ничего кроме участка памяти ненадо...
← →
ANB (2008-03-20 16:37) [18]
> И какая разница скольки задачные ОС, видеопамять то она
> есть и определенный ее участок все время отображается на
> мониторе, а все остальное предрассудки язычников высокого
> уровня... =)))
Еще под ДОС начались проблемы с SVGA, которую не успели стандартизировать. До VGA включительно, код, который работал с видеопамятью напрямую, работал практически на всех компах (есно, нужного типа видеоадаптера). Дальше же начался разброд. На современных видюхах доступ к видеопамяти не стандартизирован (только для старых режимов). Вместо этого производитель поставляет драйвер со стандартизированным интерфейсом. Через него все и работают. И это хорошо.
В принципе, помудохавшись, мона написать прямую работу с видюхой и под современными ОС. Только с большой вероятностью программа будет работать только на твоем компе. Ну или на компах с точно такой же видюхой. Так что овчинка выделки не стоит.
← →
Сергей М. © (2008-03-20 16:37) [19]
> Неужели все так сложно
Почему сложно ?
Нужно просто написать ДРЯ или воспользоваться любым подходящим готовым)
← →
ANB (2008-03-20 16:38) [20]
> Неужели все так сложно, мне же ничего кроме участка памяти
> ненадо...
Участок памяти уже давно не поможет. У твоего процесса - 4Гига собственного адресного пространства. И куда бы ты ни писал в нем - ты не знаешь, куда физически все это запишется (в ОЗУ или на винт).
← →
Andrewtitoff © (2008-03-20 16:43) [21]2 Сергей М.
А что нить вроде DelphiX поможет?
← →
Сергей М. © (2008-03-20 16:46) [22]Если в DirectX найдешь что-либо похожее на DirectScreenShot или DirectScreenGrab, то вероятно поможет)
← →
Kolan © (2008-03-20 16:47) [23]Между DirectX и DelphiX есть разница… :)
← →
Sapersky (2008-03-20 16:53) [24]А что нить вроде DelphiX поможет?
Скорее уж DirectDraw, но по большому счёту не поможет.
Пресловутый "page0" получить можно, но особого смысла в этом нет - с формами, теоретически, должен справляться BitBlt, а медиаплеер таким образом всё равно не захватить (это отдельная и весьма нетривиальная задача).
← →
Сергей М. © (2008-03-20 16:55) [25]
> Между DirectX и DelphiX есть разница
Те же фаберже, только вид сбоку)
← →
Andrewtitoff © (2008-03-20 17:10) [26]2 Sapersky
Ну в принципе конечно мне видео и неинчересует..., вот олько как я понял что BitBlt не с правляется с формами у которых прозрачность... =(((
А у меня половина прозрачных....
← →
Сергей М. © (2008-03-20 17:16) [27]
> у меня половина прозрачных
Мало того - на экране запросто могут присутствовать и не только твои формы.
Например, переднеплановое окно оверлея медиаплейера, воспроизводящего в этот момент видео, интересует оно тебя или не интересует)
← →
Andrewtitoff © (2008-03-20 17:26) [28]Так и что делать?, как мне сделать что бы грабились хотя бы все видимые в данный момент формф моего приложения в таком виде - в каком они есть?,
с активной формой понятно:
bmp := Screen.ActiveForm.GetFormImage;,
с какой нибудь одной другой тоже:
bmp := Screen.Forms[n].GetFormImage;
А все видимые как они есть?...
← →
Andrewtitoff © (2008-03-20 17:27) [29]Хотя таким способом форма отображается без прозрачностей и с фоном, который прозрачен(как при проектировании формы...)
← →
Palladin © (2008-03-20 17:38) [30]
> Мля..., ты хоть сам то смотрел что там "google + как сделать
> скриншот экрана", или тебе вопрос до конца лень дочитать?
> ..., везде приводятся примеры на подобии того что я привел,
> а я спрашитваю про видеопамять...
мля, ну добавь ключевое слово оверлей и WMR9 и поковыряй, очень позновательное занятие...
> Мало того - на экране запросто могут присутствовать и не
> только твои формы.
плюс еще и тивитюнеры всякие...
> Andrewtitoff © (20.03.08 17:26) [28]
так создай bmp, отрисуй туда все формы свои, в порядке z-ордера, они же твои, и у них канвас есть...
← →
Palladin © (2008-03-20 17:39) [31]и координаты окон есть на экране, left и top называются
← →
Плохиш © (2008-03-20 17:49) [32]
> Andrewtitoff © (20.03.08 17:26) [28]
> Так и что делать?, как мне сделать что бы грабились хотя
> бы все видимые в данный момент формф моего приложения в
> таком виде - в каком они есть?,
TCustomForm.GetFormImage не поможет "отцу русской демократии"?
← →
Andrewtitoff © (2008-03-21 11:34) [33]Эх..., ну я так и сделал...
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;{}
Страницы: 1 вся ветка
Текущий архив: 2008.04.13;
Скачать: CL | DM;
Память: 0.53 MB
Время: 0.007 c