Güncelleme Alex K. Adrian McCarthy ve arkadaşları tarafından önerilen CAPTUREBLT
ilave edildi.
Aynı sorunu yeniden oluşturamıyorum. Masaüstü ekran görüntüsünü almayı başarırsanız, o zaman her şey orada olmalı! Bunun yerine bu kodu deneyin. 3 saniye beklemenin, bir takım ucunu manuel olarak etkinleştirmek için zaman vermesi gerektiğini unutmayın.
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;
}
SRCCOPY'i deneyin | CAPTUREBLT? –
Programınız muhtemelen başka bir yerde araç ipucunu kapatan fare veya klavye ile etkinleştirilir. –
@Barmak Shemirani Hayır, Araç İpucu kapalı değil. – paul