bitblt a échoué sous Windows 10 version 1703 (15063.138)

En utilisant Visual Studio 2017, vc141, le code suivant devrait avoir une capture d’écran de la fenêtre de jeu mais il retournera maintenant une image en noir et blanc.

seul problème avec les jeux (essayé OpenGL et Vulkan, ogl return black, vulkan return white)

Avant de passer à Windows 10 1703, cela fonctionne sur Windows 10 1607 et Windows 7 SP1

#include  #include  #include  

code:

 BOOL ScreenShot(cv::Mat *img, HWND hWnd = NULL) { HBITMAP hBitmap; HDC hdcSys = GetDC(hWnd); HDC hdcMem = CreateCompatibleDC(hdcSys); void *ptrBitmapPixels; BITMAPINFO bi; HDC hdc; RECT rect; if (!GetWindowRect(hWnd, &rect) || (hWnd == NULL)) { return FALSE; } ZeroMemory(&bi, sizeof(BITMAPINFO)); LONG lWidth = rect.right - rect.left; LONG lHeight = rect.bottom - rect.top; bi.bmiHeader.biSize = sizeof(BITMAPINFO); bi.bmiHeader.biWidth = lWidth; bi.bmiHeader.biHeight = -lHeight; bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biBitCount = 32; hdc = GetDC(hWnd); hBitmap = CreateDIBSection(hdc, &bi, DIB_RGB_COLORS, &ptrBitmapPixels, NULL, 0); SelectObject(hdcMem, hBitmap); *img = cv::Mat(lHeight, lWidth, CV_8UC4, ptrBitmapPixels, 0); BitBlt(hdcMem, 0, 0, lWidth, lHeight, hdcSys, 0, 0, SRCCOPY); //DeleteObject(hBitmap); DeleteDC(hdcMem); ReleaseDC(hWnd, hdcSys); ReleaseDC(hWnd, hdc); return TRUE; } BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { /*...*/ HotKeyId = GlobalAddAtom(L"DBKGNDSCREENSHOT"); RegisterHotKey(hWnd, HotKeyId, NULL, VK_F10); /*...*/ } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { /*...*/ case WM_HOTKEY: if (wParam == HotKeyId) { cv::Mat t; HWND MainHWND; MainHWND = GetForegroundWindow(); ScreenShot(&t, MainHWND); cv::imshow("1", t); } break; /*...*/ } 

et toujours noir, même PrintWindow (au moins, nous avons une barre de titre)

 PrintWindow(hWnd, hdcMem, 0); //BitBlt(hdcMem, 0, 0, lWidth, lHeight, hdcSys, 0, 0, SRCCOPY); 

J’envoie ce programme à mon ami (sans aucune modification, son système d’exploitation = win7 x64), mais il obtient le résultat correct.

donc qu’est ce que je devrais faire?

GDI est une technologie très ancienne et devient progressivement obsolète. La méthode la plus fiable pour capturer le poste de travail sous Windows 10 serait via l’ API de duplication de poste de travail .