Ответ 1
Обновление: добавлено CAPTUREBLT
, как предложил Алекс К., Адриан МакКарти и др.
Я не могу воспроизвести ту же проблему. Если вам удастся сделать снимок экрана на рабочем столе, тогда все должно быть! Попробуйте использовать этот код. Обратите внимание, что 3-секундное ожидание должно дать время для ручной активации подсказки.
int main()
{
Sleep(3000);
TCHAR* filename = TEXT("c:\\test\\_bmp.bmp");
int width = GetSystemMetrics(SM_CXFULLSCREEN);
int height = GetSystemMetrics(SM_CYFULLSCREEN);
HDC hdc = GetDC(HWND_DESKTOP);
HBITMAP hbitmap = CreateCompatibleBitmap(hdc, width, height);
HDC memdc = CreateCompatibleDC(hdc);
HGDIOBJ oldbmp = SelectObject(memdc, hbitmap);
BitBlt(memdc, 0, 0, width, height, hdc, 0, 0, CAPTUREBLT | SRCCOPY);
WORD bpp = 24; //24-bit bitmap
DWORD size = ((width * bpp + 31) / 32) * 4 * height;
BITMAPFILEHEADER filehdr = { 'MB', 54 + size, 0, 0, 54 };
BITMAPINFOHEADER infohdr = { 40, width, height, 1, bpp };
std::vector<BYTE> bits(size);
GetDIBits(hdc, hbitmap, 0, height, &bits[0], (BITMAPINFO*)&infohdr, DIB_RGB_COLORS);
std::ofstream f(filename, std::ios::binary);
f.write((char*)&filehdr, sizeof(filehdr));
f.write((char*)&infohdr, sizeof(infohdr));
f.write((char*)bits.data(), size);
SelectObject(memdc, oldbmp);
DeleteObject(memdc);
DeleteObject(hbitmap);
ReleaseDC(HWND_DESKTOP, hdc);
ShellExecute(0, 0, filename, 0, 0, SW_SHOW);
return 0;
}