Ho cambiato completamente approccio appoggiandomi quindi sulle GDI+, facendo quest'altro codice
codice:
int MakeScreenShot(void)
{
HDC ScreenDesktop = GetDC(NULL);
HDC MemDesktop = CreateCompatibleDC(ScreenDesktop);
int ResX = GetDeviceCaps(ScreenDesktop,HORZRES);
int ResY = GetDeviceCaps(ScreenDesktop,VERTRES);
HBITMAP bitmap = CreateCompatibleBitmap(MemDesktop,ResX,ResY);
int value = BitBlt(MemDesktop,0,0,ResX,ResY,ScreenDesktop,0,0,SRCCOPY);
HPALETTE Palette = (HPALETTE)GetCurrentObject(MemDesktop,OBJ_PAL);
ULONG_PTR gditoken;
GdiplusStartupInput input;
GdiplusStartup(&gditoken,&input,NULL);
CLSID jpgsid;
Bitmap GBitmap(bitmap,Palette);
GBitmap.SetResolution(300.0f,200.0f);
GetEncoderClsid(L"image/jpeg",&jpgsid);
GBitmap.Save(L"image.jpeg",&jpgsid,NULL);
GdiplusShutdown(gditoken);
DeleteObject(bitmap);
DeleteObject(Palette);
DeleteDC(MemDesktop);
ReleaseDC(NULL,ScreenDesktop);
return 0;
}
Il tutto funziona, ma l'immagine visualizzata è sempre nera.
Ci ho messo 30 anni solo a capire come prendere l'HPALETTE del desktop per poi scorprie per caso che c'è la funzione GetCurrentObject: ho passato altrettanti secoli a capire GetSystemPaletteEntry voleva il riverimento al compatibleDC e non a quello originale.
Ad ogni modo, CreateCompatibleBitmap da una DIB? Se si allora le palette non servono e non è lì il problema. (tempo sprecato, veramente sprecato)
Ho controllato i valori di ritorno, la copia dei bit avviene correttamente.
Sono proprio fuso, avete idee?