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

Вниз

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

 
Mr. D.   (2007-06-20 20:27) [0]

Есть задача - нужно уметь снимать скриншот экрана. И вот какие есть засады:

1) делать это нужно достаточно быстро. Желательно получить наименьшее время между двумя снимками 50 мс на средних машинках. А в идеале и 10-20 мс.
Иногда требуется снимать не весь экран, а достаточно маленький его участок. Возможно, есть метод, позволяющий снимать только часть экрана, и соответственно делать это быстро.

2) желательно качественно снимать экран, какое бы приложение там не выводилу графику. С GUI еще туда сюда, а вот всякие плееры работают через оверлей, поэтому по PrintScreen например будет черное окно вместо изображения. Как бы бороться с этой напастью?

Рад буду услышать любые варианты реализации данной задачи.


 
TUser ©   (2007-06-20 20:48) [1]

BitBlt может снять часть экрана, только вот зачем такая скорость - потоковое видео записыфвать?


 
Eraser ©   (2007-06-20 20:51) [2]

> [0] Mr. D.   (20.06.07 20:27)

да, зачем так быстро?


 
Карелин Артем ©   (2007-06-20 21:26) [3]


> только вот зачем такая скорость - потоковое видео записыфвать?

Хочется человеку. Только вот зачем же спрашивать?


 
Mr. D.   (2007-06-21 14:13) [4]

TUser ©   (20.06.07 20:48) [1]
BitBlt может снять часть экрана, только вот зачем такая скорость - потоковое видео записыфвать?


скорость нужна практически для этого, чтобы записывать видео, только в специальном формате, чтобы потом наши устройства моги его воспроизводить.

Насчет BitBlt - так у него как раз есть косяк номер 2), если на экране будет вывод оверлея - то на месте вывода окажется черный экран...

Как решать эту проблему? Может как-то запретить через оверлей работать или навроде того?


 
Сергей М. ©   (2007-06-21 14:26) [5]


> Mr. D.   (21.06.07 14:13) [4]


Не проще ли перехватывать сообщение WM_PAINT ?


 
Mr. D.   (2007-06-21 14:49) [6]

Сергей М., откуда я то знаю? Вообще, если ты заметил, это я хотел задать вопросы по тому, как снять скриншот.

Что касается WM_PAINT - а какой в этом смысл? Перехватить это сообщение и вместо программы рисовать изображение, таким образом изначально его зная?! :)

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


 
Сергей М. ©   (2007-06-21 14:54) [7]


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


Программа получив сообщение WM_PAINT рисует на DC, на то WM_PAINT и существует.
Факт получения и обработки программой сообщения WM_PAINT для интересующего тебя окна как раз и есть сигнал того, что содержимое DC претерпело изменения и можно с полной уверенностью читать это обновленное содержимое.


 
Сергей М. ©   (2007-06-21 14:57) [8]


> Mr. D.   (20.06.07 20:27)


Я к тому что нефих делать бесполезные снимки 20 раз в секунду, не будучи уверенным в том, что очередной снимок хоть чем-то отличается от предыдущего.


 
Mr. D.   (2007-06-21 15:01) [9]


> Программа получив сообщение WM_PAINT рисует на DC


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


 
Сергей М. ©   (2007-06-21 15:01) [10]


> Mr. D.


И изобретать велосипед тоже не вижу резона - есть открытый протокол VNC, есть готовый софт (OpenVNC-сервер), делающий то что тебе нужно быстро и без проблем. Тебе остается только получить от сервера готовый поток в формате VNC и транскодировать его в требуемый тебе формат.


 
homm ©   (2007-06-21 15:03) [11]

> Но никто не мешает ему перерисовывать также по неким своим
> внутренним механизмам, например, вырисовывая некую динамическую
> картинку.

Один из самых больших промохов в системе оконного интерфейса операционных систем Windows :(

Если будешьделать как С.М. Предложил, незабудь проклепать каждый раз, прежде чем сблитить.


 
Сергей М. ©   (2007-06-21 15:04) [12]


> окно должно перерисовать свое содержимое, если получило
> сообщение WM_PAINT


И что тебе мешает послать WM_PAINT тогда когда это нужно тебе, а не системе ?


 
TUser ©   (2007-06-21 17:30) [13]

Консольные программы не получают wm_paint. Хинт рядом с иконой в трее - для этого посылается wm_paint или нет?


 
Mr. D.   (2007-06-21 17:35) [14]


> И изобретать велосипед тоже не вижу резона - есть открытый
> протокол VNC, есть готовый софт (OpenVNC-сервер), делающий
> то что тебе нужно быстро и без проблем


про VNC я впервые слышу. Это что, мне нужно ставить некий сервер.. Этот сервер будет что-то там делать... Правильно?

Ты, видимо, не понял, но я пишу коммерческое ПО, такие штуки плохо будут восприниматься. Требуется программа, ты ей указываешь место экрана - она там тихо чинно делает свое дело.


> Если будешьделать как С.М. Предложил, незабудь проклепать
> каждый раз, прежде чем сблитить


не понял смысл фразы. Что такое проклепать и зачем это надо делать?


> И что тебе мешает послать WM_PAINT тогда когда это нужно
> тебе, а не системе ?


не понял смысла этого действия. Какой смысл МНЕ посылать WM_PAINT. Винда то понятно почему посылает, движения курсора над рисуемой областью, перемещение окна, пересечение его с другими окнами, сворачивание, разворачивание и прочее. А мне то зачем это делать?

То есть, вместо того чтобы каждые 50 мс снимать картинку, ты предлагаешь мне каждые 50 мс посылать WM_PAINT и снимать картинку? Ничего иного, как дополнительную загрузку сторонних приложений по очередной отрисовки окна - я не вижу.


 
Mr. D.   (2007-06-21 17:35) [15]

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


 
Vlad Oshin ©   (2007-06-21 22:48) [16]

правой по экрану, свойства, дополнительно, диагностика, аппаратное:=мин
все дергается потом принт скрином


 
Eraser ©   (2007-06-21 22:52) [17]

> [15] Mr. D.   (21.06.07 17:35)

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


 
homm ©   (2007-06-21 23:19) [18]

> правой по экрану, свойства, дополнительно, диагностика,
> аппаратное:=мин
> все дергается потом принт скрином

И не о какой «делать это нужно достаточно быстро» больше не вспоминаем.


 
Zeqfreed ©   (2007-06-21 23:36) [19]

Оверлей перехватить можно, насколько я понимаю, только во время его отрисовки, т.к. видеокарта согласится отдать оверлейный буфер. А если и есть хак какой-то, то он скорее всего не универсален для разных моделей и производителей. Удовольствие, короче, то еще.

И, кстати, не надо говорить, что скриншот поверхности, на которую выводится оверлей, будет черным. Он будет цвета DCK, т.е. Destination Color Key. А уж какой это будет цвет, зависит исключительно от фантазии разработчика ;)


 
Vlad Oshin ©   (2007-06-21 23:41) [20]


> И не о какой «делать это нужно достаточно быстро» больше
> не вспоминаем.


нам дергать или им выводить?


 
@!!ex_   (2007-06-21 23:43) [21]

Либо РАДмин, либо шпион. Скорее второе.
О том, как снимать быстро скрины с экрана обсуждали, уже раз 50 на всем форуме.


 
Zeqfreed ©   (2007-06-21 23:46) [22]

> Zeqfreed ©   (21.06.07 23:36) [19]


> т.к. видеокарта согласится отдать оверлейный буфер.

Упс. Пропустил «вряд ли» между словами видеокарта и согласится :)


 
Mr. D.   (2007-06-21 23:55) [23]


> О том, как снимать быстро скрины с экрана обсуждали, уже
> раз 50 на всем форуме


если вы подскажите ссылочку - я буду очень, очень рад.


 
homm ©   (2007-06-21 23:58) [24]

> если вы подскажите ссылочку - я буду очень, очень рад.

В двух словах из последней темы, которую я видел : Быстрее BitBlt быть не может.


 
Eraser ©   (2007-06-22 00:22) [25]

> [19] Zeqfreed ©   (21.06.07 23:36)


> скорее всего не универсален для разных моделей и производителей

универсален )


 
Mr. D.   (2007-06-22 01:01) [26]

homm, а все таки что такое проклепать и зачем это нужно?

P.S. То есть, с оверлеем бороться никак не возможно? :(


 
Суслик ©   (2007-06-22 01:58) [27]


> Сергей М. ©   (21.06.07 14:54) [7]
>
> > мне нужно снять ту картинку, что выводят программы
>
>
> Программа получив сообщение WM_PAINT рисует на DC, на то
> WM_PAINT и существует.
> Факт получения и обработки программой сообщения WM_PAINT
> для интересующего тебя окна как раз и есть сигнал того,
> что содержимое DC претерпело изменения и можно с полной
> уверенностью читать это обновленное содержимое.


никто не мешает рисовать не только из wm_paint. Так, например, делает один из классов из модуля grids.pas (не помню какой) при отрисовке линии при ресайзинге мышкой ширины колонки.


 
Zeqfreed ©   (2007-06-22 06:18) [28]

> Eraser ©   (22.06.07 00:22) [25]

Универсален, если отлавливать на этапе прорисовки, разумеется. А если использовать какие-то хаки для конкретных видеокарт, считывая непосредственно буфер оверлея, то вряд ли. Хотя, я в этом не большой специалист :)


 
homm ©   (2007-06-22 07:06) [29]

> homm, а все таки что такое проклепать и зачем это нужно?

Ты же отказался от способп Сергея. Ну да ладно, если интересно, см.

GetUpdateRgn, SelectClipRgn.


 
Сергей М. ©   (2007-06-22 08:37) [30]


> Mr. D.   (21.06.07 17:35) [14]


> про VNC я впервые слышу. Это что, мне нужно ставить некий
> сервер.. Этот сервер будет что-то там делать... Правильно?
>


Считай что VNC - некоммерческий близкофункциональный (в части интерактивного взаимодействия с удаленным десктопом) аналог RDC и RAdmin.

Не хочешь ставить сервер - не ставь. Но я к тому что и сам VNC-протокол документирован и исходники одной из его реализаций открыты (см. OpenVNC), выковыривай из них ключевые фрагменты и адаптируй под себя.


 
Anatoly Podgoretsky ©   (2007-06-22 09:29) [31]

> Сергей М.  (22.06.2007 08:37:30)  [30]

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


 
Eraser ©   (2007-06-22 12:53) [32]

> [31] Anatoly Podgoretsky ©   (22.06.07 09:29)

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


 
Anatoly Podgoretsky ©   (2007-06-22 13:32) [33]

> Eraser  (22.06.2007 12:53:32)  [32]

Оно не нужно, но есть варианты и с шифрованием.


 
$Pl@Sh ©   (2007-06-22 14:44) [34]

НУ чё вы Mr. D. так напугали, он же после всего этого не придет )


 
Mr. D.   (2007-06-24 19:05) [35]

Люди! Ну так что, оверлей не победить?
Или как его можно перехватывать в момент отрисовки?

И что такое "проклепать", как выразился homm?


 
Eraser ©   (2007-06-24 19:08) [36]

> [35] Mr. D.   (24.06.07 19:05)

победить, но есть подозрение, что эта задача сложнее, чем весь ваш проект вместе взятый )


 
Mr. D.   (2007-06-24 22:04) [37]


> победить, но есть подозрение, что эта задача сложнее, чем
> весь ваш проект вместе взятый )


ничего не понял.


 
homm ©   (2007-06-24 22:14) [38]

> ничего не понял.

Ну так что оверлей не победить?
Победить, …….



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2007.07.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.04 c
15-1182344488
diwwww
2007-06-20 17:01
2007.07.22
Вопрос по шумоизолязии


1-1179398808
Dmitry_177
2007-05-17 14:46
2007.07.22
StringGrid при нажатии на ячейку был выделенный текст


15-1182356862
Mr. D.
2007-06-20 20:27
2007.07.22
Сделать снимок экрана


15-1182391972
Slider007
2007-06-21 06:12
2007.07.22
С днем рождения ! 21 июня 2007 четверг


15-1182120075
midi
2007-06-18 02:41
2007.07.22
Кто знает смысл этой функции?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский