Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.04.13;
Скачать: [xml.tar.bz2];

Вниз

Как сделать скриншот экрана   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.007 c
2-1205676755
Res
2008-03-16 17:12
2008.04.13
Cardinal


3-1195555634
shah
2007-11-20 13:47
2008.04.13
Распределенные базы данных


2-1206086434
Mishenka
2008-03-21 11:00
2008.04.13
Какие версии Дельфи могут работать с chm ами ?


2-1205902130
АндрейК
2008-03-19 07:48
2008.04.13
YearOf(now)+ год -> Incompatible types: String and Word "


2-1205594808
DJ_UZer
2008-03-15 18:26
2008.04.13
Цвета в combobox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский