Проблема с получением пикселей с созданного рабочего стола
Мне нужно получить пиксели с созданного нового рабочего стола. Вот как это я делаю:
#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 записываются пискели не созданного рабочего стола, а пискели текущего рабочего стола, не созданного.