ScreenCapture запущенного в данный момент приложения на мониторе

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

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

Поправьте меня, если я ошибаюсь. Я сделал этот вывод на основе заданного вопроса здесь

Было предложено сделать это с помощью подхода DXGI в том же потоке.

Пожалуйста, помогите мне здесь.

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

Я новичок в программировании DirectX, поэтому я не знаю о его тонкостях. Приветствуются любые советы по созданию лучшего (самого быстрого) автономного приложения для захвата экрана.


person newbie2015    schedule 01.07.2015    source источник


Ответы (1)


На самом деле DirectX может захватывать не только окно, нарисованное d3d, но и весь экран, вот так: http://imgur.com/FojhNwA

Я только вчера закончил эту программу :P

На моем компьютере использование gdi+ (Bitblt) требует около 60 мс, чтобы сделать снимок экрана 1080p, но всего 9 мс, чтобы сделать снимок экрана и отобразить кадр с помощью DirectX (IDXGIOutputDupplication).

Это самый быстрый способ, который я пробовал, но, к сожалению, он работает только в Windows 8 (я не могу запустить эту программу на своем компьютере с Windows 7).

Вы можете проверить информацию здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/hh404487

И в этой статье есть пример кода.

person kk57    schedule 04.07.2015
comment
Но можно ли для предыдущих версий Windows, верно? Использование GetFrontBufferData? Я видел несколько ответов на StackOverFlow, в которых говорилось, что этого можно добиться с помощью GetFrontBufferData. - person newbie2015; 05.07.2015
comment
О, вы напомнили мне, что я пробовал DirectX 9 с GetFrontBufferData. На моей машине скриншот делается 48-50 мс, не так быстро. Я получил образец в этом Интернете: codeproject.com/ Статьи/5051/ - person kk57; 05.07.2015
comment
Ох, хорошо. Но для Windows7 или ниже есть ли другой более быстрый способ, чем GetFrontBufferData? Я пробовал использовать OpenGL. Но он захватывает только визуализированные объекты OpenGL. Он не может захватить рабочий стол или другие приложения. - person newbie2015; 05.07.2015
comment
К сожалению, я не знаю больше из них): Но если у вас нет полного экрана, gdi+ (bitblt) может позволить вам выбрать область, которую вы хотите захватить. Скидка 50% при захвате четверти (половина ширины и высоты) - person kk57; 05.07.2015
comment
Вы упомянули, что сделали снимки экрана с помощью GetFrontBufferData(). Я попробовал это, и он отлично работает для любого другого приложения. Но возвращает черное изображение для полноэкранных игр. Здесь подробно описана моя проблема. Не могли бы вы помочь мне с фрагментом кода, который вы использовали для захвата экрана. - person newbie2015; 09.07.2015