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).