![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
alexsid1982 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 19.3.2008 Репутация: нет Всего: нет |
Такая проблема.
Необходимо получать скриншот окна проги (есть хэндл окна) несколько раз в секунду. Скриншоты должны получаться как для минимизированного окна так и для окна закрытого другими окнами. Метод с BitBlt работает корректно только если окно не перекрыто другим и не минимизированно. Если интересующее окно перекрыто другим, то на скриншоте получаем неотрисованный регион. Если окно минимизировано - вообще ничего нет. Метод с PrintWindow работает не удовлетворительно. Снятие скриншотов приводит к мерцанию окна. На codeproject описан метод снятия скриншота с пеермещением окна на передний план и последующим восстановлением его позиции. Данный метод тоже не подходит, т.к. вызывает мерцание кнопок на таксбаре и ряд других side-эффектов. Я видел программу, которая может снимать скриншоты с других окон со всеми приведенными ограничениями. Та что метод есть. Может кто-нибудь уже решал похожую задачу и знает как? |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
переместил из Алгоритмов - по идее, тут быстрее помогут
-------------------- qqq |
|||
|
||||
Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 8 Всего: 26 |
alexsid1982, а не пробовал когда окно за другими окнами посылать InvalidateRect(hWnd, &rect); ?
-------------------- ????? ??, ??????? ?????. ![]() |
|||
|
||||
alexsid1982 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 19.3.2008 Репутация: нет Всего: нет |
Пробывал, но
ни InvalidateRect ни Invalidate c Update ни RedrawWindow не SendMessage(hWnd, WM_PAINT, 0, paintStruct); не прокатывают :( |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Может WM_PRINTCLIENT попробовать? -------------------- ... |
|||
|
||||
Draeden |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 7.7.2008 Репутация: нет Всего: нет |
Подменить контекст устройства и послать сообщение WM_PAINT, после чего вернуть дескриптор на место
![]() Та программа, которая реализует этот процесс, использует сервисы или драйвера ? |
|||
|
||||
alexsid1982 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 19.3.2008 Репутация: нет Всего: нет |
А что PrintWindow не тоже самое делает? ;) Добавлено @ 01:12
В смысле?.. Моя прога не использует ни того ни другого. Это как? по подробнее мона? Это сообщение отредактировал(а) alexsid1982 - 9.7.2008, 01:14 |
||||
|
|||||
Draeden |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 7.7.2008 Репутация: нет Всего: нет |
Это шутка
![]() Вас не устраивает, что обработчик WM_PAINT ( и других подобных сообщений ) перерисовывает только ту часть окна, которая указана в контексте устройства, а Windows, для оптимизации, исключает из этой области зоны закрытые другими окнами. Эту проблему можно решить по крайне мере двумя способами: 1. Сделать так, чтобы нужное окно оказалось на рабочем столе в котором вообще нет других окон. Как известно, все окна появляются на интерактивном рабочем столе WinSta0, но есть и неинтерактивные рабочие столы ( их можно посмотреть в директории объектов \Windows\WindowStations ). Вот если отправить окно на один из этих рабочих столов, там перерисовать и вернуть окно обратно, то можно получить нормальный скриншот. 2. При перерисовке окна, соответсвующая функция использует контекст устройства, полученный, вероятно, вызовом GetDC. Контекст устройства - это дескриптор, а значит это значение представляет собой индекс в таблице дескрипторов для данного процесса. Можно подменить нужный дескриптор на свой ( например на DC для памяти, созданный вызовом CreateCompatibleDC ). В этом случае окно перерисуется в нужном вам месте, а затем вы вернёте дескриптор на место. Оба способа могут быть реализованы только в виде сервисов и требуют неслабой техники программирования. Вообще лучше почитайте MSDN - Device contexts, там наверняка описана такая возможность как подмена контекста устройства ( что то вроде SetStdHandle для консоли ). |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Вроде нет, судя по описанию - она WM_PRINT использует. -------------------- ... |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
а чтоб не субклассировать окошко и сохранять то что оно рисует (хватая WM_PAINT), когда вообще рисует?
вот пример: http://www.fengyuan.com/article/wmprint.html -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
Draeden |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 7.7.2008 Репутация: нет Всего: нет |
Да... патчить код я бы не додумался
![]() |
|||
|
||||
alexsid1982 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 19.3.2008 Репутация: нет Всего: нет |
Спасибо за активность попробую что-нить реализовать
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |