PrintWindow и Microsoft Edge

у нас проблема с функцией PrintWindow в Windows 10 (сборка 10166). Когда мы вызываем PrintWindow (https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd162869(v=vs.85).aspx) для захвата изображения окна браузера Microsoft Edge (Project Spartan) получаем черный изображение.

Кто-нибудь знает причину этого и как это можно исправить/избежать? Или, может быть, какой-то другой способ захватить изображение окна, которое может быть в фоновом режиме и скрыто за другими окнами?

ОБНОВЛЕНИЕ: мы пробовали отправлять сообщения WM_PRINTCLIENT и WM_PRINT и вызывать DefWindowProc с помощью WM_PRINT, но результат тот же — просто черное изображение. Мы также пытались использовать BitBlt для копирования контроллера домена окна на поверхность памяти, но это тоже не работает. Лучшее решение, которое у нас есть сейчас, — вывести окно браузера на передний план, захватить весь экран и обрезать снимок экрана до размера окна клиента; но это может прерывать и раздражать пользователей из-за переключения приложений, которые используются в данный момент.


person Andrey Belym    schedule 14.07.2015    source источник
comment
Скорее всего это просто невозможно   -  person David Heffernan    schedule 14.07.2015
comment
Вот некоторые другие случаи, когда PrintWindow не работает ="nofollow noreferrer">social.msdn.microsoft.com/forums/windows/en-us/   -  person demonplus    schedule 14.07.2015
comment
WM_PRINTCLIENT должно поддерживаться рассматриваемым окном (несмотря на слухи об обратном, Windows не вмешивается и не выполняет WM_PAINT растровое изображение памяти в крайнем случае)   -  person Jonathan Potter    schedule 14.07.2015
comment
@JonathanPotter, спасибо за ваш комментарий, я пытался отправлять сообщения WM_PRINTCLIENT и WM_PRINT и вызывать DefWindowProc с помощью WM_PRINT, но результаты такие же - просто черное изображение.   -  person Andrey Belym    schedule 14.07.2015
comment
@Andrey Джонатан имел в виду не то, что вы не можете вызывать DefWindowProc, если вы не внедрили код в процесс. И вы не можете синтезировать сообщения WM_PAINT. Как я уже сказал, может быть невозможно сделать то, что вы хотите.   -  person David Heffernan    schedule 16.07.2015


Ответы (2)


Если вы хотите сделать скриншот страницы в браузере. попробуйте эту библиотеку JavaScript: http://html2canvas.hertzen.com/ Скрипт проходит через DOM страницы он загружается. Он собирает информацию обо всех элементах, которые затем использует для построения представления страницы. Другими словами, на самом деле он не делает скриншот страницы, а строит ее представление на основе свойств, считываемых из DOM.

Я только что попробовал на своей машине Microsoft Edge и Chrome и работал с обоими. Надеюсь, это сработает!

person Rami Sarieddine    schedule 23.11.2015

У меня была такая же проблема с IE попробуйте это. Самый стабильный результат был с двойным вызовом

PrintWindow(hWnd, hdcScreen, 0);
PrintWindow(hWnd, hdcScreen, PW_CLIENTONLY);
person vik_78    schedule 02.02.2017