Ho cambiato completamente approccio appoggiandomi quindi sulle GDI+, facendo quest'altro codice
Il tutto funziona, ma l'immagine visualizzata è sempre nera.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; }
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?

Rispondi quotando