c语言截取屏幕,全屏截取?
全屏截取(改)
潘小龙,顾时明二人著的”用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 <=
wBitCount = 8;
else if (iBits <= 24)
wBitCount = 24;
else
wBitCount = iBits;
//计算调色板大小
if (wBitCount <=
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);
c语言截取屏幕,全屏截取?相关推荐
- 截取计算机全屏画面的方法是按,下列用于截取计算机全屏画面的方法不正确的是()。...
1.使用计算机自带的截图工具: 1)一般情况截图的按键就是"Print Screen SysRq",有些键盘显示为"PrtSC Sys Rq",位置一般就在F1 ...
- 截取网页全屏的两种方法
截取网页全屏的方式 很多时候我们需要对网页的全部内容进行一个截屏,但像微信或者QQ的截图方式只能截取当前页面的内容,下面介绍几种比较简单的截取页面全部内容的方法. 1.谷歌浏览器自带截图功能 2.使用 ...
- Vscode快捷键失灵屏幕全屏无法退出
...检查下是否切换到了大写输入模式 另外想到了一个差不多的,就是屏幕全屏无法退出,试试F11
- 截取计算机全屏画面的方法有,电脑怎么截图全屏 详细方法介绍
电脑想必大家应该了解了吧!因为电脑现在来说已经非常地普遍了,几乎家家户户都拥有一台电脑.不仅如此,电脑的在其他领域的应用也非常地广泛,电脑有很多的功能,这一点大家在平时也体会到了吧!电脑的功能在各个领 ...
- android 旋转屏幕全屏,重新组合活动布局以在旋转屏幕时全屏播放video
在一个活动中,我嵌入了一个video窗口小部件(与SurfaceView相关联的VideoView或MediaPlayer),当旋转屏幕时,应调整其大小. 此活动用作TabHost中的内容. 我目前的 ...
- 副屏幕全屏_电脑 双屏(双屏电脑主屏副屏设置)
怎么把电脑一变二 双屏显示设置法 随着人们对现实要求越来越高,双屏显示成为用户越来越关注的对象,如抄股做T+0操作,既要关注大盘的走势又要关注股票的走势,就需要不断的切换,很麻烦:在看盘时看看网络电影 ...
- UNITY设置屏幕全屏但是周围有黑框的解决方法
有个项目之前设置全屏的方法是: //获取设置当前屏幕分辩率 Resolution[] resolutions = Screen.resolutions; //设置当前分辨率 Screen.SetRes ...
- 副屏幕全屏_电脑屏幕不能全屏显示怎么办 显示器有黑边无法全屏原因及解决方法...
你有没有遇到过显示器不能全屏显示的情况呢?可能有些遇到过的朋友会说了,这太简单了嘛,一般就是分辨率的问题,调下分辨率就好了,其实,不能全屏显示不一定就是分辨率的问题,对于不是分辨率的问题,那么电脑屏幕 ...
- 副屏幕全屏_win7双屏电脑主屏副屏设置|Win7系统如何设置双屏显示?
随着人们对现实要求越来越高,双屏显示越来越受人们的关注.在日常生活中,我们使用电脑一般只需要一个显示屏,不过有时候做一些工作需要用到多个显示屏.例如抄股做T+0操作,既要关注大盘的走势又要关注股票的走 ...
最新文章
- 管理系统状态栏和导航栏(翻译)
- 不给欧美科技公司封杀的机会,从换这个国产软件开始!
- cpu性能测试软件 国际象棋,国际象棋、科学计算,整机性能测试
- 暑期训练日志----2018.8.16
- linux svn 客户端安装配置
- maxcompute操作_MaxCompute问答整理之9月
- 【王道计组笔记】高速缓存器:局部性原理及性能分析
- 【转】关于VS2005中不显示解决方案的解决方法
- jQuery事件委托
- XenApp / XenDesktop 7.6 初体验一 安装, 配置站点和序列号服务器
- Java零基础进阶教程分享,人手一套的javase实用视频教程
- 小米无线网卡linux驱动下载,Linux下安装MT7601U无线网卡驱动
- 应力循环次数60ant_齿轮应力循环次数公式
- oracle数据库中文乱码解决办法
- VIN码识别/车架号识别独家支持云识别
- 云原生2.0时代,保险企业为何要迎智而上?
- 网络安全工程师的学习路线,超级简单,收藏这一篇就够了
- java和区块链哪个难_java 区块链中设计合理的难度系数
- long long类型
- 超干货丨你想了解的短视频私域流量玩法都在这