c语言截取屏幕,全屏截取?

本文纠正了潘小龙和顾时明关于VC屏幕截取编程中的错误代码,并提供了可直接使用的修正后代码,实现了全屏截图并保存为.bmp文件的功能。通过创建设备描述表、位图以及调色板等操作,成功捕获并保存屏幕图像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

全屏截取(改)

潘小龙,顾时明二人著的”用VC进行屏幕截取编程 “一文中的代码有多处错误,我在yu_hl大虾的大力协助下对其进行修正,以下代码只需复制粘帖就能使用:

文件保存在C盘根目录.

CString dt;

CTime m_CurDT;

m_CurDT=CTime::GetCurrentTime();

dt.Format(“%d-%d-%d “,m_CurDT.GetYear(),m_CurDT.GetMonth(),m_CurDT.GetDay());

dt+=m_CurDT.Format(“%H时%M分%S秒”);

dt+=”.bmp”;

CString bmpname;

bmpname=”c:\\”;

bmpname+=dt;

HDC       hScrDC, hMemDC;

// 屏幕和内存设备描述表

int       nX, nY, nX2, nY2;

// 位图宽度和高度

int       xScrn, yScrn;

// 屏幕分辨率

HBITMAP    hBitm ap, hOldBitmap;

//为屏幕创建设备描述表

hScrDC = CreateDC(“DISPLAY”, NULL, NULL, NULL);

//为屏幕设备描述表创建兼容的内存设备描述表

hMemDC = CreateCompatibleDC(hScrDC);

// 获得屏幕分辨率

xScrn = GetDeviceCaps(hScrDC, HORZRES);

yScrn = GetDeviceCaps(hScrDC, VERTRES);

// 获得全屏坐标

nX = 0;

nY = 0;

nX2 = xScrn;

nY2 = yScrn;

// 创建一个与屏幕设备描述表兼容的位图

hBitmap = CreateCompatibleBitmap(hScrDC, nX2, nY2);

// 把新位图选到内存设备描述表中

hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);

// 把屏幕设备描述表拷贝到内存设备描述表中

BitBlt(hMemDC, 0, 0, nX2, nY2, hScrDC, nX, nY, SRCCOPY);

//得到屏幕位图的句柄

hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);

//清除

DeleteDC(hScrDC);

DeleteDC(hMemDC);

HDC            hDC;

int            iBits;

//当前显示分辨率下每个像素所占字节数

WORD           wBitCount;

//位图中每个像素所占字节数

//定义调色板大小, 位图中像素字节大小 ,

DWORD          dwPaletteSize=0,

dwBmBitsSize,

dwDIBSize, dwWritten;

BITMAP          Bitmap;

//位图属性结构

BITMAPFILEHEADER   bmfHdr;

//位图文件头结构

BITMAPINFOHEADER   bi;

//位图信息头结构

LPBITMAPINFOHEADER lpbi;

//指向位图信息头结构

HANDLE           fh, hDib, hPal,hOldPal=NULL;

//定义文件,分配内存句柄,调色板句柄

//计算位图文件每个像素所占字节数

hDC = CreateDC(“DISPLAY”,NULL,NULL,NULL);

iBits = GetDeviceCaps(hDC, BITSPIXEL) *

GetDeviceCaps(hDC, PLANES);

DeleteDC(hDC);

if (iBits <= 1)

wBitCount = 1;

else if (iBits <= 4)

wBitCount = 4;

else if (iBits <=

0a13646ba3dc40414480cfbef935ccd0.gif

wBitCount = 8;

else if (iBits <= 24)

wBitCount = 24;

else

wBitCount = iBits;

//计算调色板大小

if (wBitCount <=

0a13646ba3dc40414480cfbef935ccd0.gif

dwPaletteSize = (1 <

sizeof(RGBQUAD);

//设置位图信息头结构

GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);

bi.biSize            = sizeof(BITMAPINFOHEADER);

bi.biWidth           = Bitmap.bmWidth;

bi.biHeight          = Bitmap.bmHeight;

bi.biPlanes          = 1;

bi.biBitCount        = wBitCount;

bi.biCompression     = BI_RGB;

bi.biSizeImage       = 0;

bi.biXPelsPerMeter   = 0;

bi.biYPelsPerMeter   = 0;

bi.biClrUsed          = 0;

bi.biClrImportant    = 0;

dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31)/32) * 4 * Bitmap.bmHeight;

//为位图内容分配内存

hDib  = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINF OHEADER));

lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);

*lpbi = bi;

// 处理调色板

hPal = GetStockObject(DEFAULT_PALETTE);

if (hPal)

{

hDC = ::GetDC(NULL);

hOldPal = SelectPalette(hDC,(HPALETTE)hPal, FALSE);

RealizePalette(hDC);

}

// 获取该调色板下新的像素值

GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,(BITMAPINFO*)lpbi,DIB _RGB_COLORS);

//恢复调色板

if (hOldPal)

{

SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);

RealizePalette(hDC);

::ReleaseDC(NULL, hDC);

}

//创建位图文件

fh = CreateFile(bmpname, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);

// 设置位图文件头

bmfHdr.bfType = 0x4D42;  // “BM”

dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;

bmfHdr.bfSize = dwDIBSize;

bmfHdr.bfReserved1 = 0;

bmfHdr.bfReserved2 = 0;

bmfHdr.bfOffBits = (DWORD)sizeof

(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;

// 写入位图文件头

WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);

// 写入位图文件其余内容

WriteFile(fh, (LPSTR)lpbi, dwDIBSize,

&dwWritten, NULL);

//清除

GlobalUnlock(hDib);

GlobalFree(hDib);

CloseHandle(fh);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值