Форум: "Прочее";
Текущий архив: 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