Oppure

Loading
23/03/06 20:10
Come da subject come faccio in c a fare lo screenshot dello schermo? insomma salvare un immagine jpg o bmp dello stato attuale dello schermo? Aiutatemi mi sto scervellando da tempo senza soluzione :d
23/03/06 21:54
pierotofy
In C la vedo dura, in C++ invece puoi fare cos?:

Screenshot.h
#ifndef SCREENSHOT_H
#define SCREENSHOT_H
#endif

/*
Thanks to http://www.geocities.com/krishnapg/bitmap.html#SaveBitmap
*/

/* Screenshot.h
Il seguente modulo contiene le funzioni per catturare uno screenshot dell'utente
*/
void GetScreenBitmap();
void SaveBitmap(char *szFilename,HBITMAP hBitmap);



Screenshot.cpp
#include <windows.h>
#include <stdio.h>
#include "Screenshot.h"

/* Screenshot.cpp | by PieroTofy 2005 http://www.pierotofy.it |

Si veda il file Screenshot.h per l'utilizzo delle funzioni 
presenti nel modulo  */


void GetScreenBitmap(){
	HBITMAP hBitmap;

	//Preme il tasto per catturare la schermata negli appunti
	keybd_event(VK_SNAPSHOT,0,0,1);
	
	//E lo rilascia
	keybd_event(VK_SNAPSHOT,0,0,0);

	if(OpenClipboard(NULL)){
		//Prende l'immagine dagli appunti
		hBitmap=(HBITMAP)GetClipboardData(CF_BITMAP);

		//E la salva
		SaveBitmap("c:\~Buffer.bmp",hBitmap);

		//Chiude gli appunti
		CloseClipboard();

		//TODO: invia i dati
		//TODO: cancella il file
	}

}

/* 
Funzione per scrivere l'handle di una bitmap su file
Thanks to http://www.geocities.com/krishnapg/bitmap.html#SaveBitmap
*/
void SaveBitmap(char *szFilename,HBITMAP hBitmap){
      HDC        hdc=NULL;
      FILE*      fp=NULL;
      LPVOID     pBuf=NULL;
      BITMAPINFO bmpInfo;
      BITMAPFILEHEADER  bmpFileHeader; 
      do{ 
            hdc=GetDC(NULL);
            ZeroMemory(&bmpInfo,sizeof(BITMAPINFO));
            bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
            GetDIBits(hdc,hBitmap,0,0,NULL,&bmpInfo,DIB_RGB_COLORS); 
            if(bmpInfo.bmiHeader.biSizeImage<=0)
            bmpInfo.bmiHeader.biSizeImage=bmpInfo.bmiHeader.biWidth
*abs(bmpInfo.bmiHeader.biHeight)*(bmpInfo.bmiHeader.biBitCount+7)/8;
            if((pBuf = malloc(bmpInfo.bmiHeader.biSizeImage))==NULL)
            {
                  //MessageBox( NULL, "Unable to Allocate Bitmap Memory", "Error", MB_OK|MB_ICONERROR);
                  break;
            }           
            bmpInfo.bmiHeader.biCompression=BI_RGB;
            GetDIBits(hdc,hBitmap,0,bmpInfo.bmiHeader.biHeight,pBuf, &bmpInfo, DIB_RGB_COLORS);       
            if((fp = fopen(szFilename,"wb"))==NULL)
            {
                  //MessageBox( NULL, "Unable to Create Bitmap File", "Error", MB_OK|MB_ICONERROR);
                  break;
            } 
            bmpFileHeader.bfReserved1=0;
            bmpFileHeader.bfReserved2=0;
            bmpFileHeader.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+bmpInfo.bmiHeader.biSizeImage;
            bmpFileHeader.bfType='MB';
            bmpFileHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); 
            fwrite(&bmpFileHeader,sizeof(BITMAPFILEHEADER),1,fp);
            fwrite(&bmpInfo.bmiHeader,sizeof(BITMAPINFOHEADER),1,fp);
            fwrite(pBuf,bmpInfo.bmiHeader.biSizeImage,1,fp); 
      }while(false); 
            if(hdc)     ReleaseDC(NULL,hdc); 
            if(pBuf)    free(pBuf); 
            if(fp)      fclose(fp);
}


;)
Ultima modifica effettuata da pierotofy 23/03/06 21:55
Il mio blog: piero.dev
23/03/06 22:46
Tempestivo!! e sempre esauriente grazie!! ;)