Я использую модуль Webrtc Native для захвата одного окна:
webrtc::DesktopCaptureOptions co = webrtc::DesktopCaptureOptions::CreateDefault();
desktop_capturer = webrtc::DesktopCapturer::CreateWindowCapturer(co);
desktop_capturer->GetSourceList(&desktop_screens);
desktop_capturer->SelectSource(desktop_screens[selectedIndex].id);
desktop_capturer->Start(this);
Он работает нормально, но для некоторых приложений, таких как «Google Chrome», я получаю черный экран и после поиска обнаруживаю, что это происходит с любым приложением, использующим «аппаратное ускорение», и если я отключил аппаратное ускорение в «Настройках Google Chrome», я могу захватить его окно не получая черный экран, но я не могу сделать это для каждого приложения, которое использует «аппаратное ускорение»
И я попытался реализовать другой захват окна, и я получил ту же проблему «Черное изображение для каждого приложения использует аппаратное ускорение»:
void CaptureFrame(int i, System::String ^ title){
RECT rc;
std::string stdTitle = convertToStdString(title);
std::wstring tit = s2ws(stdTitle);
LPCWSTR t = tit.c_str();
HWND hwnd = FindWindow(0, t);
if (hwnd == NULL)
{
return;
}
GetClientRect(hwnd, &rc);
HDC hdcScreen = GetDC(NULL);
HDC hdc = CreateCompatibleDC(hdcScreen);
HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen,
rc.right - rc.left, rc.bottom - rc.top);
SelectObject(hdc, hbmp);
PrintWindow(hwnd, hdc, PW_CLIENTONLY);OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_BITMAP, hbmp);
CloseClipboard();
std::string ind = std::to_string(i);
std::wstring stemp = s2ws(stdTitle + ind + ".jpeg");
LPCWSTR result = stemp.c_str();
CImage image;
image.Attach(hbmp);
image.Save(result, Gdiplus::ImageFormatBMP);DeleteDC(hdc);
DeleteObject(hbmp);
ReleaseDC(NULL, hdcScreen);}
Задача ещё не решена.
Других решений пока нет …