Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.22;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.027 c
15-1182493849
StriderMan
2007-06-22 10:30
2007.07.22
Пакетная обработка DFM


2-1182939554
zvm
2007-06-27 14:19
2007.07.22
как проще сделать примитивную 3D графику?


2-1182860818
ы!
2007-06-26 16:26
2007.07.22
скрытие


15-1182417644
Juice
2007-06-21 13:20
2007.07.22
Упавшая вижуал студия 2005.


2-1182875295
next22
2007-06-26 20:28
2007.07.22
TEdit..TButton и TImage