Aggiornamento: aggiunto CAPTUREBLT
come suggerito da Alex K., Adrian McCarthy et al.
Non riesco a riprodurre lo stesso problema. Se riesci a scattare una schermata del desktop, tutto dovrebbe essere lì! Prova questo codice invece. Nota che l'attesa di 3 secondi dovrebbe dare il tempo di attivare manualmente un suggerimento.
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;
}
Prova SRCCOPY | CAPTUREBLT? –
Il tuo programma è probabilmente attivato da un mouse o da una tastiera che chiude il tooltip altrove. –
@Barmak Shemirani No, la punta dello strumento non è chiusa. – paul