18,124
社区成员
发帖
与我相关
我的任务
分享
#pragma comment(lib,"gdi32")
#include <windows.h>
#include <vector>
using namespace std;
// 获取HDC的数据
BOOL GetHDCData(HDC hdc,const RECT &rcDC,std::vector<BYTE> &vtBuf)
{
BOOL bRes = FALSE;
HBITMAP hBmp = NULL;
HDC hdcMem = NULL;
__try
{
//Initilaize the bitmap information
BITMAPINFO bmpInfo = {0};
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = rcDC.right - rcDC.left;
bmpInfo.bmiHeader.biHeight = rcDC.bottom - rcDC.top;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biBitCount = 24;
//Create the compatible DC to get the data
hdcMem = CreateCompatibleDC(hdc);
if (hdcMem == NULL)
{
//ASSERT(FALSE);
//RETAILMSG(TRUE,(TEXT("CreateCompatibleDC failed! Error Code:0x%x\r\n"),GetLastError()));
__leave;
}
//Get the data from the memory DC
BYTE *pData = NULL;
hBmp = CreateDIBSection(hdcMem,&bmpInfo,DIB_RGB_COLORS,reinterpret_cast<VOID **>(&pData),NULL,0);
if (hBmp == NULL)
{
//ASSERT(FALSE);
//RETAILMSG(TRUE,(TEXT("CreateDIBSection failed! Error Code:0x%x\r\n"),GetLastError()));
__leave;
}
HGDIOBJ hOldObj = SelectObject(hdcMem, hBmp);
//Draw to the memory DC
SIZE sizeImg = {bmpInfo.bmiHeader.biWidth,bmpInfo.bmiHeader.biHeight};
SIZE sizeDC = {rcDC.right - rcDC.left,rcDC.bottom - rcDC.top};
StretchBlt(hdcMem,
0,
0,
sizeImg.cx,
sizeImg.cy,
hdc,
rcDC.left,
rcDC.top,
sizeDC.cx,
sizeDC.cy,
SRCCOPY|0x40000000);//CAPTUREBLT
vtBuf.resize(sizeImg.cx * sizeImg.cy * 3);
memcpy(&vtBuf[0],pData,vtBuf.size());
SelectObject(hdcMem, hOldObj);
bRes = TRUE;
}
__finally
{
if (hBmp != NULL)
{
DeleteObject(hBmp);
}
if (hdcMem != NULL)
{
DeleteDC(hdcMem);
}
}
return bRes;
}
// 保存HDC为BMP文件
BOOL WriteBmp(const char *strFile,HDC hdc,const RECT &rcDC)
{
std::vector<BYTE> vtData;
if (GetHDCData(hdc,rcDC,vtData) == FALSE)
{
return FALSE;
}
SIZE sizeImg = {rcDC.right - rcDC.left,rcDC.bottom - rcDC.top};
BITMAPINFOHEADER bmInfoHeader = {0};
bmInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
bmInfoHeader.biWidth = sizeImg.cx;
bmInfoHeader.biHeight = sizeImg.cy;
bmInfoHeader.biPlanes = 1;
bmInfoHeader.biBitCount = 24;
//Bimap file header in order to write bmp file
BITMAPFILEHEADER bmFileHeader = {0};
bmFileHeader.bfType = 0x4d42; //bmp
bmFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmFileHeader.bfSize = bmFileHeader.bfOffBits + ((bmInfoHeader.biWidth * bmInfoHeader.biHeight) * 3); ///3=(24 / 8)
HANDLE hFile = CreateFile(strFile,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return FALSE;
}
DWORD dwWrite = 0;
WriteFile(hFile,&bmFileHeader,sizeof(BITMAPFILEHEADER),&dwWrite,NULL);
WriteFile(hFile,&bmInfoHeader, sizeof(BITMAPINFOHEADER),&dwWrite,NULL);
WriteFile(hFile,&vtData[0], vtData.size(),&dwWrite,NULL);
CloseHandle(hFile);
return TRUE;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HDC hdc = CreateDC("DISPLAY", NULL, NULL, NULL);
RECT rcSave = {0,0,GetDeviceCaps(hdc,HORZRES),GetDeviceCaps(hdc,VERTRES)};
WriteBmp("D:\\ScreenCapture.BMP",hdc,rcSave);
DeleteDC(hdc);
return 0;
}
#if 0
#ifndef CAPTUREBLT
#define CAPTUREBLT 0x40000000
#endif
HBITMAP CaptureScreen(LPRECT lpRect)//lpRect为NULL时表示全屏幕截图
{
HDC hdc, hdcMem ;
HBITMAP hemfCopy ;
HWND hwndScr ;
int dstcx, dstcy ;
if(lpRect)
{
dstcx = lpRect->right - lpRect->left ;
dstcy = lpRect->bottom - lpRect->top ;
}
else
{
dstcx = GetSystemMetrics(SM_CXSCREEN) ;
dstcy = GetSystemMetrics(SM_CYSCREEN) ;
}
if (LockWindowUpdate(hwndScr = GetDesktopWindow ()))
{
hdc = GetDCEx (hwndScr, NULL, DCX_CACHE | DCX_LOCKWINDOWUPDATE) ;
hdcMem = CreateCompatibleDC (hdc) ;
if(NULL==hdcMem)
{
ReleaseDC (hwndScr, hdc) ;
LockWindowUpdate (NULL) ;
return NULL;
}
hemfCopy = CreateCompatibleBitmap (hdc, abs(dstcx), abs(dstcy)) ;
if(NULL==hemfCopy)
{
DeleteDC (hdcMem) ;
ReleaseDC (hwndScr, hdc) ;
LockWindowUpdate (NULL) ;
return NULL;
}
SelectObject (hdcMem, hemfCopy) ;
if(lpRect)
StretchBlt (hdcMem, 0, 0, abs(dstcx), abs(dstcy),
hdc, lpRect->left, lpRect->top, dstcx, dstcy, SRCCOPY|CAPTUREBLT) ;
else
BitBlt (hdcMem, 0, 0, dstcx, dstcy,
hdc, 0, 0, SRCCOPY|CAPTUREBLT) ;
DeleteDC (hdcMem) ;
ReleaseDC (hwndScr, hdc) ;
LockWindowUpdate (NULL) ;
return hemfCopy;
}
return NULL;
}
#endif