Premessa: se non sai cos'è un DC e come funziona a grandi linee la GDI di Windows dai un'occhiata qui e poi eventualmente chiedi.
codice:
int MakeScreenShoot(void)
{
//Ottiene un device context relativo a tutto lo schermo
HDC ScreenDC = GetDC(NULL);
//Ottiene le dimensioni dello schermo
int ResX = GetSystemMetrics(SM_CXSCREEN);
int ResY = GetSystemMetrics(SM_CYSCREEN);
//Crea un device context in cui verrà selezionata la DIB su cui verrà copiato il contenuto del desktop
HDC DestDC = CreateCompatibleDC(NULL);
//Crea una DIB in memoria con la stessa profondità di colori del desktop
HBITMAP DestBitmap = CreateCompatibleBitmap(DestDC,ResX,ResY);
//Salva la bitmap attualmente selezionata nel DC per ripristinarla in seguito (per poter poi eliminare DestBitmap) e seleziona nel DC DestDC la DIB appena creata
HBITMAP OldBitmap = (HBITMAP)SelectObject(MemDesktop,DestBitmap);
//Copia il contenuto del DC del desktop nel DC che contiene la DIB DestBitmap, che quindi ora conterrà una copia del contenuto del desktop
BitBlt(DestDC,0,0,ResX,ResY,ScreenDC,0,0,SRCCOPY);
//Da qui in poi il codice che hai scritto diventa casinaro e non mi pare molto corretto; rimando a qui per informazioni su come salvare un HBITMAP
//...
//Deseleziona dal DC DestDC la DIB, selezionando la vecchia bitmap che in esso era prima contenuta
SelectObject(DestDC,OldBitmap);
//Ora che la DIB è deselezionata la si può cancellare
DeleteObject(DestBitmap);
//Elimina il DC di destinazione
DeleteDC(DestDC);
//Rilascia il DC relativo allo schermo
ReleaseDC(NULL,ScreenDC);
return 0;
}
Per quanto riguarda il salvataggio in JPEG o PNG, non mi pare che sia possibile a meno di grandi casini; il supporto per questi formati si limita alla possibilità di dare dati JPEG o PNG in input a StretchDIBits e SetDIBitsToDevice (http://msdn.microsoft.com/en-us/libr...08(VS.85).aspx).