Можно ли сделать снимок окна с эскизом DWM Windows 7 в нем?

Я начинаю верить, что с Windows API ничего не поделаешь.

У меня два окна. В одном есть эскиз DWM. Я хочу сделать снимок экрана одного окна с миниатюрой в другом. Когда я это делаю, используя bitblt, все копируется, кроме эскиза. Его просто нет в растровом изображении.

Так как же работает рендеринг DWM? Я имею в виду, что если DWM отображает эскизы непосредственно на DC зарегистрированного окна, тогда мой подход должен работать. Я смущен.

Огромное спасибо.


person Dogan Demir    schedule 03.02.2010    source источник
comment
Существует Windows 7 API SDK, который вы можете скачать с сайта Microsoft ..;)   -  person t0mm13b    schedule 04.02.2010
comment
И чем он отличается от библиотек, которые уже идут с Win 7?   -  person Dogan Demir    schedule 04.02.2010


Ответы (2)


DWM работает иначе: содержимое эскиза никогда не переносится на DC вашего окна. Вместо этого механизм композиции DWM будет отображать эскиз непосредственно поверх содержимого вашего окна, когда отображается рабочий стол.

К сожалению, нет (официального) способа получить доступ к данным изображения эскиза DWM (однако есть хак в сети, которая пытается получить доступ к базовым данным вершин и отобразить их в DirectX 9).

person LorenzCK    schedule 01.06.2010
comment
Просто попробовал это сам на Win10 и обнаружил, что он не работает, как и OP. Почему Alt + PrntScr захватывает все, когда вы вставляете это в mspaint? - person mikew; 05.10.2019
comment
Справедливый момент: разница в том, что миниатюры DWM не переносят что-либо активно в контекст рисования вашего окна. Миниатюра DWM только напоминает компоновщику Windows о необходимости скомпоновать одно окно поверх другого при рендеринге последних пикселей, которые будут отображаться на экране. При захвате экрана вы захватываете окончательный рендеринг и, таким образом, также можете получить составные окна: например, попробуйте использовать API захвата окна в своем собственном окне, и вы сможете получить все (исходное содержимое Windows + эскизы ). - person LorenzCK; 06.10.2019
comment
Какие API захвата окон, по вашему мнению, подойдут? Я пробовал получить растровое изображение в самом DC, я пробовал BitBlt, я пробовал PrintWindow, у меня ничего не работает. - person mikew; 08.10.2019
comment
Примечание: я не тестировал ни один из них, это просто методы, которые могут работать. Я думаю, при захвате экрана через GDI, вы должны делать снимок экрана в окне рабочего стола. само, а не конкретное окно, которое вы пытаетесь клонировать. Таким образом, вы получаете вывод рабочего стола, а не содержимое исходного окна (конечно, вам придется обрезать рабочий стол, чтобы получить только то окно, которое вас интересует). В противном случае вы можете узнать, как это сделать с помощью DirectX или новые API UWP. - person LorenzCK; 09.10.2019
comment
Спасибо, я изучу эти варианты. Я забыл упомянуть, что я захватываю конкретное окно потому, что мне нужно захватить эти окна, когда они находятся ЗА другими окнами в Z-порядке. Таким образом, они эффективно скрыты и не будут отображаться при захвате рабочего стола. Вот почему я сначала получаю DC самого окна. - person mikew; 12.10.2019

Вы не можете ожидать, что эскиз будет помещен в контекст устройства окна, потому что эскиз не помещается в контекст устройства окна. Так что ваш подход не сработает.

Но если вы пытаетесь украсть эскиз приложения, просто спросите Dwm, чтобы отобразить его уменьшенное изображение. Это позволит вам представить пользователю точный эскиз, который вы хотите.

Если, с другой стороны, вы хотите получить доступ к пикселям в миниатюре другого процесса, у вас есть проблема.

person Ian Boyd    schedule 18.01.2011