Как сделать копию экрана в Windows

Интересно, что существует около десятка способов сделать копию экрана в Windows. Программно, без привлечения нестандартного оборудования или сторонних библиотек. Статья “Screen recording with WDDM 1.2” описывает наиболее часто используемые:

  1. GDI: GetDC(NULL), а затем BitBlt(), чтобы скопировать данные из видеопамяти в системную.

  2. Direct3D: метод IDirect3DDevice9::GetFrontBufferData() позволяет скопировать содержимое видеопамяти в системный буфер.

  3. Mirror Display Driver: позволяет напрямую перехватывать команды отрисовки.

  4. OpenGL: дает прямой доступ к отображаемому буферу в видеопамяти.

  5. Windows 8: появился специализированный интерфейс IDXGIOutputDuplication.

  6. Перехват интерфейсов Direct3D: вызовы интерфейсов Direct3D довольно легко перехватить, внедрившись в процесс. Это позволяет скопировать содержимое заднего буфера непосредственно перед его показом.

Кроме этих есть еще несколько способов:

  1. DirectDraw: дает доступ к видеопамяти через так называемую primary surface (DDSCAPS_PRIMARYSURFACE).

  2. DirectX 10: метод IDXGIOutput::GetDisplaySurfaceData() похож на IDirect3DDevice9::GetFrontBufferData(), но работает только для полноэкранных приложений.

  3. Media API: Статья “Various methods for capturing the screen” описывает способ копирования экрана с помощью Windows Media API. Скорее всего это обертка вокруг GDI.

  4. WM_PRINT: правильно написанные приложения должны уметь отрисовывать свои окна в произвольный контекст.

  5. DWM: некоторые умудрились раскопать недокументированные функции Desktop Window Manager, дающие доступ к Direct3D поверхностям, куда отрисовываются окна верхнего уровня.

  6. WDDM: в конце концов можно написать собственный WDDM драйвер (или фильтр), чтобы перехватывать графические команды. Сложно, но, в принципе, реально.

Несмотря на все разнообразие, самый древний способ (GDI) остается оптимальным для большинства применений. Он относительно медленный, но при этом работает на любой версии Windows. Остальные способы (кроме, может, Direct3D и DirectDraw) либо не работают со всеми версиями ОС, либо конфликтуют с видео драйверами и приложениями.

comments powered by Disqus