Как сделать копию экрана в Windows
Jun 24, 2012 · CommentsПрограммированиеWindows
Интересно, что существует около десятка способов сделать копию экрана в Windows. Программно, без привлечения нестандартного оборудования или сторонних библиотек. Статья “Screen recording with WDDM 1.2” описывает наиболее часто используемые:
-
GDI: GetDC(NULL), а затем BitBlt(), чтобы скопировать данные из видеопамяти в системную.
-
Direct3D: метод IDirect3DDevice9::GetFrontBufferData() позволяет скопировать содержимое видеопамяти в системный буфер.
-
Mirror Display Driver: позволяет напрямую перехватывать команды отрисовки.
-
OpenGL: дает прямой доступ к отображаемому буферу в видеопамяти.
-
Windows 8: появился специализированный интерфейс IDXGIOutputDuplication.
-
Перехват интерфейсов Direct3D: вызовы интерфейсов Direct3D довольно легко перехватить, внедрившись в процесс. Это позволяет скопировать содержимое заднего буфера непосредственно перед его показом.
Кроме этих есть еще несколько способов:
-
DirectDraw: дает доступ к видеопамяти через так называемую primary surface (DDSCAPS_PRIMARYSURFACE).
-
DirectX 10: метод IDXGIOutput::GetDisplaySurfaceData() похож на IDirect3DDevice9::GetFrontBufferData(), но работает только для полноэкранных приложений.
-
Media API: Статья “Various methods for capturing the screen” описывает способ копирования экрана с помощью Windows Media API. Скорее всего это обертка вокруг GDI.
-
WM_PRINT: правильно написанные приложения должны уметь отрисовывать свои окна в произвольный контекст.
-
DWM: некоторые умудрились раскопать недокументированные функции Desktop Window Manager, дающие доступ к Direct3D поверхностям, куда отрисовываются окна верхнего уровня.
-
WDDM: в конце концов можно написать собственный WDDM драйвер (или фильтр), чтобы перехватывать графические команды. Сложно, но, в принципе, реально.
Несмотря на все разнообразие, самый древний способ (GDI) остается оптимальным для большинства применений. Он относительно медленный, но при этом работает на любой версии Windows. Остальные способы (кроме, может, Direct3D и DirectDraw) либо не работают со всеми версиями ОС, либо конфликтуют с видео драйверами и приложениями.