Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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]

Ну так делай как делал на паскале, раз разницы нет&#133


 
Сергей М. ©   (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 есть разница&#133 :)


 
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.55 MB
Время: 0.021 c
8-1178543822
Veter
2007-05-07 17:17
2008.04.13
Геометрические фигуры


2-1205821694
Unknowing
2008-03-18 09:28
2008.04.13
Либо чудо, либо фокус...


8-1178055969
XProger
2007-05-02 01:46
2008.04.13
Быстрый скриншот


4-1187003036
DevilDevil
2007-08-13 15:03
2008.04.13
Удалить все сообщения контролу из очереди сообщений


3-1195462325
zdm
2007-11-19 11:52
2008.04.13
Кириллица в данных о пользователе Firebird