如何用C程式語言擷取全螢幕,並輸出成BMP檔案
2010/07/08 18:13
瀏覽673
迴響1
推薦0
引用0
問題:如何用C程式語言擷取全螢幕,並輸出成BMP檔案?
請別回答按下Print Scr XD!
解答:
void CaptureFullWindow(void)
{
HDC hScrDC,
hMemDC;
int width, height;
//the pointer will
save all pixel point's color value
BYTE *lpBitmapBits = NULL;
//creates a device context for the screen device
hScrDC =
CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
//get the screen
point size
width = GetDeviceCaps(hScrDC, HORZRES);
height =
GetDeviceCaps(hScrDC, VERTRES);
//creates a memory device
context (DC) compatible with the screen device(hScrDC)
hMemDC =
CreateCompatibleDC(hScrDC);
//initialise the struct
BITMAPINFO for the bimap infomation,
//in order to use the
function CreateDIBSection
// on wince os, each pixel stored by
24 bits(biBitCount=24)
//and no compressing(biCompression=0)
BITMAPINFO RGB24BitsBITMAPINFO;
ZeroMemory(&RGB24BitsBITMAPINFO, sizeof(BITMAPINFO));
RGB24BitsBITMAPINFO.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
RGB24BitsBITMAPINFO.bmiHeader.biWidth = width;
RGB24BitsBITMAPINFO.bmiHeader.biHeight = height;
RGB24BitsBITMAPINFO.bmiHeader.biPlanes = 1;
RGB24BitsBITMAPINFO.bmiHeader.biBitCount = 24;
//use the function
CreateDIBSection and SelectObject
//in order to get the bimap
pointer : lpBitmapBits
HBITMAP hBitmap = CreateDIBSection(hMemDC,
(BITMAPINFO*)&RGB24BitsBITMAPINFO,
DIB_RGB_COLORS, (void
**)&lpBitmapBits, NULL, 0);
HGDIOBJ hOldBitmap =
SelectObject(hMemDC, hBitmap);
// copy the screen dc to the
memory dc
BitBlt(hMemDC, 0, 0, width, height, hScrDC, 0, 0,
SRCCOPY);
//if you only want to get the every pixel color value,
//you can begin here and the following part of this function will be
unuseful;
//the following part is in order to write file;
//bimap file header in order to write bmp file
BITMAPFILEHEADER bmBITMAPFILEHEADER;
ZeroMemory(&bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER));
bmBITMAPFILEHEADER.bfType = 0x4d42; //bmp
bmBITMAPFILEHEADER.bfOffBits = sizeof(BITMAPFILEHEADER) +
sizeof(BITMAPINFOHEADER);
bmBITMAPFILEHEADER.bfSize =
bmBITMAPFILEHEADER.bfOffBits + ((width*height)*3); ///3=(24 / 8)
DWORD dwNumBytes;
HANDLE hFile = CreateFile( L"\\Storage
Card\\capture.bmp",
GENERIC_WRITE,
(DWORD) 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile == INVALID_HANDLE_VALUE)
return ;
WriteFile(hFile, &bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER),
&dwNumBytes, NULL); // Write the file header
WriteFile(hFile,
&(RGB24BitsBITMAPINFO.bmiHeader), sizeof(BITMAPINFOHEADER),
&dwNumBytes, NULL); // Write the DIB header
WriteFile(hFile,
lpBitmapBits, 3*width*height, &dwNumBytes, NULL); //Write DIB bits
FlushFileBuffers(hFile);
CloseHandle(hFile);
//delete
DeleteObject(hMemDC);
DeleteObject(hScrDC);
DeleteObject(hBitmap);
DeleteObject(hOldBitmap);
}
你可能會有興趣的文章:
限會員,要發表迴響,請先登入
迴響(1) :
1樓. W_T@guest2010/10/07 22:44Re: 如何用C程式語言擷取全螢幕,並輸出成BMP檔案
請問要如何用BCB擷取全螢幕
hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
這裡會有問題耶

