Проблема с получением пикселей с созданного рабочего стола

Мне нужно получить пиксели с созданного нового рабочего стола. Вот как это я делаю:

#include <windows.h> 

char* g_pImageBits = 0;
BITMAPINFOHEADER g_sImageInfo = {};
HDESK g_hDesk;

void GetMyImage()
{
    g_hDesk = OpenDesktopA("123", 0, TRUE, GENERIC_ALL);
    if (!g_hDesk)
    {
        g_hDesk = CreateDesktopA("123", NULL, NULL, 0, GENERIC_ALL, NULL);
    }
    SetThreadDesktop(g_hDesk);

    HWND hWnd = GetDesktopWindow();
    RECT rc;
    GetClientRect(hWnd, &rc);

    int cx = rc.right - rc.left;
    int cy = rc.bottom - rc.top;

    if (!g_pImageBits || (g_sImageInfo.biWidth != cx) || (g_sImageInfo.biHeight != cy))
    {
        if (g_pImageBits)
            free(g_pImageBits);

        int line = cx * 4;
        int size = cy * line;
        g_pImageBits = (char*)malloc(size);

        g_sImageInfo.biSize = sizeof(g_sImageInfo);
        g_sImageInfo.biWidth = cx;
        g_sImageInfo.biHeight = cy;
        g_sImageInfo.biPlanes = 1;
        g_sImageInfo.biBitCount = 32;
        g_sImageInfo.biCompression = BI_RGB;
        g_sImageInfo.biSizeImage = size;
    }

    HDC hDc = GetDC(hWnd);
    HDC hMemDc = CreateCompatibleDC(hDc);
    HBITMAP hMemBitmap = CreateCompatibleBitmap(hDc, cx, cy);
    HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDc, hMemBitmap);
    BitBlt(hMemDc, 0, 0, cx, cy, hDc, rc.left, rc.top, SRCCOPY);
    SelectObject(hMemDc, hOldBitmap);
    GetDIBits(hDc, hMemBitmap, 0, cy, g_pImageBits, (BITMAPINFO*)&g_sImageInfo, DIB_RGB_COLORS);
    DeleteObject(hMemBitmap);
    DeleteDC(hMemDc);
    ReleaseDC(hWnd, hDc);
    //CloseDesktop(g_hDesk);
}

В итоге в g_pImageBits записываются пискели не созданного рабочего стола, а пискели текущего рабочего стола, не созданного.


Ответы (0 шт):