GetPixel принимает сначала x, потом y. У вас там Height и Width не в том порядке переданы.
Это будет ошибкой, если одна из сторон более чем в 2 раза больше другой. Это может быть, если у вас широкоформатный монитор.
У вас там битмап сохраняется в sceen2.png - оно там что-то сохранило вообще? Иначе проблема может быть не GetPixel, а с самим хБитмапом.
Edit:
Еще проблема может быть с масштабированием. В результате
GetSystemMetrics(SM_CYSCREEN)
возвращает не то, что вам надо и BitBlt не срабатывает из-за слишком большого размера.
Попробуйте вызвать
SetProcessDPIAware.
Еще может быть проблема, что вы SelectObject делаете 2 раза с одним и тем же membit. Надо во второй раз что-то другое подставлять, чтобы HBitmap освободить. Иначе оно, похоже, так и остается привязано к DC.
Вот мой рабочий код:
HBITMAP GameManager::GetScreenshot(HWND window) {
HDC hScreenDC = GetDC(window);
HDC hMemoryDC = CreateCompatibleDC(hScreenDC);
RECT window_rect;
GetClientRect(window, &window_rect);
int width = window_rect.right - window_rect.left;
int height = window_rect.bottom - window_rect.top;
int result_width = width;
int result_height = height;
HBITMAP hBitmap = CreateCompatibleBitmap(hScreenDC, result_width, result_height);
HBITMAP hOldBitmap = static_cast<HBITMAP>(SelectObject(hMemoryDC, hBitmap));
StretchBlt(hMemoryDC, 0, 0, result_width, result_height, hScreenDC, 0, 0, width, height, SRCCOPY);
hBitmap = static_cast<HBITMAP>(SelectObject(hMemoryDC, hOldBitmap));
DeleteDC(hMemoryDC);
DeleteDC(hScreenDC);
return hBitmap;
}