Здравствуйте, Tom, Вы писали:
Tom>Есть окно. На окне могут лежать контролы + быть что то нарисованно. Надо получить изображение этого окна как HBITMAP.
Очевидно, что окно не обязано иметь битмапу, в которой хранится ее изображение (на все окна — ресурсов не напасешься). Оно рисует себя в графический контекст.
Отсюда:
— если окно ничем сверху не закрыто, то
1. получаешь контекст окна (GetWindowDC)
2. создаешь промежуточный контекст (CreateCompatibleDC), в нем — битмапу (внимание! по умолчанию битмапа черно-белая)
3. копируешь содержимое из оконного в промежуточный (BitBlt)
4. выгружаешь битмапу из контекста.
Поскольку контекст окна — это обкусанный фрагмент контекста дисплея (с учетом закрытых вышележащими окнами участков), то попытка скопировать перекрытый участок даст изображение из видеопамяти — некий коллаж из твоего и чужих окон.
То же относится и к полупрозрачным окнам.
— можно попробовать заставить окно прорисоваться в твой рукодельный контекст
(я не пробовал ).
Здравствуйте, adontz, Вы писали:
A>PS не знаю что выйдет, но вроде лучше чем alt-printscreen слать. Не ясно как он себя ведёт если окно не имеет фокуса.
Про alt-printscreen это естественно шутка
Q161299. HOWTO: Capture and Print the Screen, a Form, or Any Window
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Гсопода, а почему никто не вспомнил про WM_PRINT? Или я чего недоглядел? Наиболее правильный способ, как я помню — послать окну WM_PRINT. Остальные дают артефакты при наложении других окошек и т.п.
Читаем http://www.fengyuan.com/article/wmprint.html
Tom>сабж
Здравствуйте, Andrew S, Вы писали:
AS>Гсопода, а почему никто не вспомнил про WM_PRINT? Или я чего недоглядел? Наиболее правильный способ, как я помню — послать окну WM_PRINT. Остальные дают артефакты при наложении других окошек и т.п. AS>Читаем http://www.fengyuan.com/article/wmprint.html
Tom>>сабж
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
OE>Только вместо GetDesktopWindow вставь свой HWND
естественно прямое копирование будет работать только для неперекрытых никем окон
нужно попросить окно перерисоваться самому в подсунутом контексте...
... << RSDN@Home 1.0 beta 4 >> silent
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
И?? чем отличается этот код от кода в постинге Александра Федотова или Old->etc? Ровно так же получаем DC окна и Blt его на MemoryDC.
// Copy the window contents to the memory surface.
BitBlt(hdcMemory, 0, 0, rc.right, rc.bottom, hdcWindow, 0, 0, SRCCOPY);
Ровно так же обламываемся при перекрытии окна другими... Ну, а что выводит его на принтер — а нам то это нафиг? Или я что недопонял????
V>или смотрим Q186736 там тоже не дураки сидят
естественно ты прав, поэтому твой ответ и мною оценен, а не указанные тобой другие посты... кстати я это же отметил у старого экспериментатора и отвтил уже...
а по поводу моей ссылки — нужно учесть что я немного прикололся, смайлик е?
имею ввиду что ребята сами предлагают решения которые имеют глюки (указанные тобой) и размножают их через свою KB откуда они вполне могли переползти и в опять же указанные тобой посты! объяснил?
сорри что действительно сам через свой этот ответ начал вводить в заблуждение
AS>Ровно так же обламываемся при перекрытии окна другими... Ну, а что выводит его на принтер — а нам то это нафиг? Или я что недопонял????
V>>или смотрим Q186736 там тоже не дураки сидят
... << RSDN@Home 1.0 beta 4 >> silent
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Угу. Зато я понял, что книгу Фень Юаня не только must have, но и must read. Иначе ни о каком программировании графики под win32 и речи быть не может. Вот только с поллитрами в отношении DIBSection у него там мутно все рассказано. Ну да на пустом месте сам раком станешь...
Здравствуйте, Alex Fedotov, Вы писали:
O>>Вместо всплывания можно создать десктоп еще один и засунуть окно туда.
AF>Нельзя. Нельзя взять окно с одного десктопа и переназначить другому.
Точно? А как тогда работают различные утилиты для управления десктопами? Пункт "отправить окно в десктоп XXX" там никто не отменял...
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, Alex Fedotov, Вы писали:
O>>Вместо всплывания можно создать десктоп еще один и засунуть окно туда.
AF>Нельзя. Нельзя взять окно с одного десктопа и переназначить другому.
А как это эмулируют проги-мультидесктопы ? Я сам десктопы не ковырял просто.
Лучше так:
1. создаешь compatible dc, инициализируешь — смотри код, как писали выше.
2. А теперь внимание:
SendMessage(hwnd, WM_ERASEBKGND, (WPARAM)hCompatibleDC, 0);
SendMessage(hwnd, WM_PAINT, (WPARAM)hCompatibleDC, 0);
и содержимое окна рисуется в наш DC (без наложения других окон).
3. забираешь bitmap у нашего DC.
P.S. Хотя в MSDN написано, что первый параметр для WM_PAINT "not used", но это работает — факт.
SG>P.S. Хотя в MSDN написано, что первый параметр для WM_PAINT "not used", но это работает — факт.
В MSDN написано
For some common controls, the default WM_PAINT message processing checks the wParam parameter. If wParam is non-NULL, the control assumes that the value is an HDC and paints using that device context.
Но как я помню, само окно не обязано рассматривать wparam как контекст устройства и тем более туда писать. Оно получает свой контекст из BeginPaint. Тем не менее попробую — интересно, вдруг и правда работает.
WinZip скрыт за окном вижал студии. Без сообщений копируется кусок картинки экрана "над" винзипом
С сообщениями делается ровно то же. Any suggestions?
SG>Лучше так: SG>1. создаешь compatible dc, инициализируешь — смотри код, как писали выше. SG>2. А теперь внимание: SG>SendMessage(hwnd, WM_ERASEBKGND, (WPARAM)hCompatibleDC, 0); SG>SendMessage(hwnd, WM_PAINT, (WPARAM)hCompatibleDC, 0); SG>и содержимое окна рисуется в наш DC (без наложения других окон). SG>3. забираешь bitmap у нашего DC.
SG>P.S. Хотя в MSDN написано, что первый параметр для WM_PAINT "not used", но это работает — факт.
Маленькое уточнение — стормозил и забыл убрать при тестах с сообщениями BitBlt. Когда убрал — получается пустой битмап с черным фоном. Видимо, другого способа, кроме как описанного у Фень Юаня, нет.
Здравствуйте, Andrew S, Вы писали:
AS>Маленькое уточнение — стормозил и забыл убрать при тестах с сообщениями BitBlt. Когда убрал — получается пустой битмап с черным фоном. Видимо, другого способа, кроме как описанного у Фень Юаня, нет.
Скорее всего, это результат использования CreateCompatibleBitmap.
Она создает ЧЕРНО-БЕЛУЮ битмапу!!! Это классическейшие грабли.
Еще раз. При использовании BitBlt все работает. Сохраняется часть экрана над WinZip.
Вы код то посмотрите — я его привел... Для разнообразия :/
AS>>Маленькое уточнение — стормозил и забыл убрать при тестах с сообщениями BitBlt. Когда убрал — получается пустой битмап с черным фоном. Видимо, другого способа, кроме как описанного у Фень Юаня, нет.
К>Скорее всего, это результат использования CreateCompatibleBitmap. К>Она создает ЧЕРНО-БЕЛУЮ битмапу!!! Это классическейшие грабли.
Чушь. В файл сохраняется битмапа с цветностью экрана... Вобщем, видимо, не стоит думать, что мы тут умнее Фень Юаня. Было бы можно проще — он бы так и сделал. К>Сделай для разнообразия CreateBitmap с TrueColor.
К>Она создает ЧЕРНО-БЕЛУЮ битмапу!!! Это классическейшие грабли.
Читать постинги надо и пользоваться MSDN Когда не читают — это действительно классические грабли :/
Because memory device contexts allow both color and monochrome bitmaps, the format of the bitmap returned by the CreateCompatibleBitmap function differs when the specified device context is a memory device context. However, a compatible bitmap that was created for a nonmemory device context always possesses the same color format and uses the same color palette as the specified device context.
Аноним, представься А еще желательно видеть конкретные ссылки на топики MSDN где ЭТО подробно описано. Точнее не само это, как это ПРАВИЛЬНО сделать, а не то, что предлагает m$ Tom>>сабж
1. Создаём компатибле HDC на память.
2. Создаём компатибле BITMAP с соответствующимиразмерами и селектим его в наш битмап.
3. Делаем BitBlt из HDC формы в наш, который на памяти.
4. Ещё раз делаем селект и получаем нашь BITMAP с содержимым формы.
Здравствуйте, Tom, Вы писали:
Tom>1. Создаём компатибле HDC на память. Tom>2. Создаём компатибле BITMAP с соответствующимиразмерами и селектим его в наш битмап. Tom>3. Делаем BitBlt из HDC формы в наш, который на памяти. Tom>4. Ещё раз делаем селект и получаем нашь BITMAP с содержимым формы.
Tom>PS: Проверял правда только на NT
И еще добавь: для окна, ничем сверху не перекрытого.
См. остальные сообщения этой ветки. Тут уже много сказано.
Здравствуйте, old->*Plutonia_Experiment(), Вы писали:
OP>Можно сделать так. OP>Находим главное окно аппликации. OP>Заставляем его всплыть. На сайте про это много постов. OP>Далее грабим. И все.
Встречный вопрос: а если требуется "грабануть" не главное окно аппликации, а дочернее окно / контрол ? (Их то не заставишь вспыть!)
Можно конечно заставить всплыть родительское окно для требуемого дочернего...
Кроме того — проблема с перекрыванием нашего окна каким-либо TopLevel окном остаётся.
И даже если проверять, сохранять, изменять, и восстанавливать аттрибут TopLevel у нашего окна (что не есть красивое решение, имхо), всё равно остаётся проблема в случае с частично видимым (или полностью невидимым) окном — не думаю, что двигать /(показывать и прятать) искомое окно — это выход.
Так что не проходит.
OP>Вместо всплывания можно создать десктоп еще один и засунуть окно туда. А потом десктоп грохнуть. OP>В MSDN есть примерчик с десктопами.
Pls obysnite 4ego en prawelno delay pri otkritom oktne wse normalno beretza nujnii pixel a wot kogda sakrito okno todrugim ili swernuto ne pomogart hoty wrode kak WM_PAINT posilay moemu oknu , wesi topik pro4ital no ne kak ne ponyl w 4em sagwoska
Конечно, по-хорошему надо было бы запросить IsWindowVisible для ВСЕЙ цепочки от hwnd2 до hwnd, сохранить результат, сделать Visible каждого в цепочке,
а в конце — восстановить исходную конфигурацию... но пусть уж остается как есть
А>Конечно, по-хорошему надо было бы запросить IsWindowVisible для ВСЕЙ цепочки от hwnd2 до hwnd, сохранить результат, сделать Visible каждого в цепочке, А>а в конце — восстановить исходную конфигурацию... но пусть уж остается как есть