Как создать модуль, который читает буфер кадров и сохраняет содержимое в виде изображения - PullRequest
1 голос
/ 16 декабря 2009

В Windows, по-видимому, есть как минимум два способа получить доступ к буферу кадров: GDI и DirectX.

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

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    // Insert frame buffer reading via GDI here.
    return 0;
}

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

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

Ответы [ 3 ]

1 голос
/ 16 декабря 2009

Это на самом деле не так просто. Для одного GDI и DirectX используются совершенно разные способы хранения информации буфера кадра.

Например, для перехвата буфера DirectX вам необходимо перехватить вызовы DirectX, а затем при вызове захватить фрейм-буфер в файл.

1 голос
/ 18 декабря 2009

Если я правильно читаю ваш вопрос, похоже, вы хотите написать консольное приложение (без графического интерфейса), которое будет выполнять снимок экрана. Если это так, просто снимок экрана Google, и вы найдете все виды примеров кода, каждый из которых выполняет почти одинаковые шаги, используйте GetDC (0), чтобы получить HDC рабочего стола, затем используйте BitBlt для копирования с него источник DC в DC создаваемого вами растрового изображения, а затем запишите свое растровое изображение на диск. Обратите внимание, что делать это в консольном приложении просто, делать это из службы NT нельзя. Кроме того, клиентская область некоторых приложений (видео, OpenGL и т. Д.) Не будет захвачена без какой-либо дополнительной работы, которая становится очень волосатой.

Альтернативный метод состоит в том, чтобы ваше приложение использовало функцию API SendKeys для имитации Shift + PrintScreen, затем извлекало буфер обмена и записывал его в файл.

Если вы используете C, используйте этот код вместо SendKeys.

// Simulate press of "Shift+PrintScrn"...
keybd_event(VK_SHIFT, 0, 0, 0);
keybd_event(VK_SNAPSHOT, 0, 0, 0);
// then release...
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0);
1 голос
/ 16 декабря 2009

Вам не нужен WinMain () для использования GDI - просто создайте ссылку на соответствующие библиотеки, и все готово.

Вы можете создавать консольные приложения, которые создают окна. Там нет особой необходимости для WinMain (). Если вам нужен HINSTANCE, вы можете позвонить GetModuleHandle(NULL).

...