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?