РЕДАКТИРОВАТЬ: я вижу, что это указано в вашей первой ссылке на редактирование как «путь GDI».Это по-прежнему достойный способ, даже если использовать рекомендации по производительности на этом сайте, я думаю, вы можете легко получить 30 кадров в секунду.
Из этого комментария (у меня нет опыта в этом,Я просто ссылаюсь на того, кто это делает):
HDC hdc = GetDC(NULL); // get the desktop device context
HDC hDest = CreateCompatibleDC(hdc); // create a device context to use yourself
// get the height and width of the screen
int height = GetSystemMetrics(SM_CYVIRTUALSCREEN);
int width = GetSystemMetrics(SM_CXVIRTUALSCREEN);
// create a bitmap
HBITMAP hbDesktop = CreateCompatibleBitmap( hdc, width, height);
// use the previously created device context with the bitmap
SelectObject(hDest, hbDesktop);
// copy from the desktop device context to the bitmap device context
// call this once per 'frame'
BitBlt(hDest, 0,0, width, height, hdc, 0, 0, SRCCOPY);
// after the recording is done, release the desktop context you got..
ReleaseDC(NULL, hdc);
// ..delete the bitmap you were using to capture frames..
DeleteObject(hbDesktop);
// ..and delete the context you created
DeleteDC(hDest);
Я не говорю, что это самая быстрая операция, но операция BitBlt
обычно выполняется очень быстро, если вы копируете между контекстами совместимого устройства.
Для справки Open Broadcaster Software реализует нечто подобное в рамках своего "dc_capture" метода, хотя вместо создания целевого контекста hDest
с использованием CreateCompatibleDC
они используют IDXGISurface1
, который работает с DirectX 10+.Если для этого нет поддержки, они возвращаются к CreateCompatibleDC
.
Чтобы изменить его на использование определенного приложения, вам нужно изменить первую строку на GetDC(game)
, где game
- дескрипторокно игры, а затем установите правильные height
и width
окна игры тоже.
Как только у вас есть пиксели в hDest / hbDesktop, вам все равно нужно сохранить его в файл, но если вытогда вы делаете снимок экрана, и я думаю, что вы захотите сохранить в памяти определенное их количество и сохранить его в видеофайле порциями, поэтому я не буду указывать на код для сохранения статического изображения на диск.