Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2010, 23:57   #1
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию Windows, capture screenshot

Приветствую.

Сразу скажу, это не очередная тема про то как сделать скриншот окна?! Или же, все же она самая

Дело в том, что передо мной опять стоит задача снятия и получения битовой карты любого окна в системе (свернуто, за пределами экрана, слой и т.п.)

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

1. GetWindowDC, BitBlt - да супер, но свернутые и часть, которая за экраном, окна выходят черные, т.е. не получаем скриншот.

2. PrintWindow - лучше вариант, и свернутые и вообще где бы ни было окно, выходит "качественный" скриншот, НО, очень мизирное количество приложений под Windows обрабатывает, корректно, данное сообщение, а именно WM_PRINT (и аналогичные)

3. DWM - только в Seven/Vista, причем надо включить предварительно в настройках. Почему он? Получаем в real-time thumbnail и можем его распологать где и на чем угодно, но опять таки, хоть и могу пожертвовать совместимостью, но DWM API не дает API для получения именно битовой карты thumbnail'а, что не есть хорошо в моей ситуации. Хак? Тоже спорный вопрос. Внедряться в dwm.exe, перехватывать обраточик (попробуй найди его еще...) который формирует очередной кадр для созданного thumbnail, и в нем вытягивать и информировать мое приложение о новом кадре уже с битовой картой.

В итоге, к чему все это? Как по мне лучший вариант 3й, но там много спорных вопросов, и не очень рвусь хакать dwm.exe. Может я упустил какие то варианты? Прошу, выскажитесь здесь

Спасибо.
BOBAH13 вне форума Ответить с цитированием
Старый 07.11.2010, 01:28   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

А какой функцией вы получаете thumbnail через dwm? И какого он типа?

P.S. я на самом деле не думаю, что там что-то типа HBITMAP...
MaTBeu вне форума Ответить с цитированием
Старый 07.11.2010, 09:56   #3
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от MaTBeu Посмотреть сообщение
А какой функцией вы получаете thumbnail через dwm? И какого он типа?

P.S. я на самом деле не думаю, что там что-то типа HBITMAP...
DWM API. Там HTHUMBNAIL, и вы с помощью API сообщаете на каком окне и где (RECT) расположить вывод, а выводит уже сама система, а именно DWM. А вот как получить биты... уже секрет. Скачал хак, ребята постарались, хакнули dwm, там действительно DirectX, и они хакают CreateDevice функцию. Но на столько все закручивать смысла нет.
BOBAH13 вне форума Ответить с цитированием
Старый 07.11.2010, 13:20   #4
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Цитата:
Там HTHUMBNAIL, и вы с помощью API сообщаете на каком окне и где (RECT) расположить вывод, а выводит уже сама система, а именно DWM. А вот как получить биты... уже секрет.
Я могу ошибаться, но что вам мешает вывести thumbnail на свое какое-то окошко при помощи DWM API, а потом снять битмап через GetWindowDC или PrintWindow. Предварительно, нужно написать обработчики на сообщения WM_PRINT у своей программы. Следовательно, отпадает недостаток 2-го метода.

Я понимаю, решение не ахти, но это лучше чем хакать dwm.exe.
MaTBeu вне форума Ответить с цитированием
Старый 07.11.2010, 14:00   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от MaTBeu Посмотреть сообщение
Я могу ошибаться, но что вам мешает вывести thumbnail на свое какое-то окошко при помощи DWM API, а потом снять битмап через GetWindowDC или PrintWindow. Предварительно, нужно написать обработчики на сообщения WM_PRINT у своей программы. Следовательно, отпадает недостаток 2-го метода.

Я понимаю, решение не ахти, но это лучше чем хакать dwm.exe.
В принципе вариант, но вопрос в другом тогда, ведь все эти манипуляции по сути видны для юзера, и на сколько долго этот процесс? Посмотрим, пока отложил этот вопрос. Может в будущем как то. А так да, спасибо, это тоже хороший вариант.
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Screenshot на WInAPI susel Win Api 3 28.04.2010 21:04
Зациклился ScreenShot Streetmagic Мультимедиа в Delphi 1 10.04.2010 17:42
Screenshot W0LF Общие вопросы Delphi 4 10.10.2009 00:47
Capture image from webcamera iLeshik Win Api 3 10.05.2009 09:48
screenshot nicky Общие вопросы C/C++ 2 12.04.2009 14:12