C++实现屏幕截图功能
时间:2019-04-15
本文章向大家介绍C++实现屏幕截图功能,主要包括C++实现屏幕截图功能使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文实例为大家分享了C++实现全屏截图功能的具体代码,供大家参考,具体内容如下
最近维护的项目,在某些情况下,光有日志还不行,于是添加了截图功能,特定情况下,会自动截图,辅助分析,从而改进程序。以下是截图实现代码。
void CDemoDlg::ScreenShot(void) { CWnd *pDesktop = GetDesktopWindow(); CDC *pdeskdc = pDesktop->GetDC(); CRect re; //获取窗口的大小 pDesktop->GetClientRect(&re); CBitmap bmp; bmp.CreateCompatibleBitmap(pdeskdc, re.Width(), re.Height()); //创建一个兼容的内存画板 CDC memorydc; memorydc.CreateCompatibleDC(pdeskdc); //选中画笔 CBitmap *pold = memorydc.SelectObject(&bmp); //绘制图像 memorydc.BitBlt(0, 0, re.Width(), re.Height(), pdeskdc, 0, 0, SRCCOPY); //获取鼠标位置,然后添加鼠标图像 CPoint po; GetCursorPos(&po); HICON hinco = (HICON)GetCursor(); memorydc.DrawIcon(po.x - 10, po.y - 10, hinco); //选中原来的画笔 memorydc.SelectObject(pold); BITMAP bit; bmp.GetBitmap(&bit); //定义 图像大小(单位:byte) DWORD size = bit.bmWidthBytes * bit.bmHeight; LPSTR lpdata = (LPSTR)GlobalAlloc(GPTR, size); //后面是创建一个bmp文件的必须文件头 BITMAPINFOHEADER pbitinfo; pbitinfo.biBitCount = 24; pbitinfo.biClrImportant = 0; pbitinfo.biCompression = BI_RGB; pbitinfo.biHeight = bit.bmHeight; pbitinfo.biPlanes = 1; pbitinfo.biSize = sizeof(BITMAPINFOHEADER); pbitinfo.biSizeImage = size; pbitinfo.biWidth = bit.bmWidth; pbitinfo.biXPelsPerMeter = 0; pbitinfo.biYPelsPerMeter = 0; GetDIBits(pdeskdc->m_hDC, bmp, 0, pbitinfo.biHeight, lpdata, (BITMAPINFO*) &pbitinfo, DIB_RGB_COLORS); BITMAPFILEHEADER bfh; bfh.bfReserved1 = bfh.bfReserved2 = 0; bfh.bfType = ((WORD)('M' << 8) | 'B'); bfh.bfSize = size + 54; bfh.bfOffBits = 54; //写入文件 CFile file; CString strFileName(GetAppPathW().c_str()); strFileName += _T("ScreenShot\\"); CreateDirectory((LPCTSTR)strFileName, NULL); CTime t = CTime::GetCurrentTime(); CString tt = t.Format("%Y-%m-%d_%H-%M-%S"); strFileName += tt; strFileName += _T(".bmp"); if (file.Open((LPCTSTR)strFileName, CFile::modeCreate | CFile::modeWrite)) { file.Write(&bfh, sizeof(BITMAPFILEHEADER)); file.Write(&pbitinfo, sizeof(BITMAPINFOHEADER)); file.Write(lpdata, size); file.Close(); } GlobalFree(lpdata); }
代码注释详尽,我就不多说啥了,保存为bmp无损文件,体积会有些大,朋友可以转化为png格式保存哦。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- Python笔记从html中提取字段
- 一条细小的报警短信的处理(r6笔记第96天)
- 1.react的基础知识
- 防火墙设置的小问题(r6笔记第94天)
- 有没有必要把机器学习算法自己实现一遍?
- python中从str中提取元素到list以及将list转换为str
- 简单易学的机器学习算法——线性回归(2)
- Java基础-26(01)总结网络编程
- undo retention的思考(一)
- 优化算法——人工蜂群算法(ABC)
- 用GPU加速深度学习: Windows安装CUDA+TensorFlow教程
- 由报警邮件分析发现的备库oracle bug(r7笔记第12天)
- Python中的__init__()方法整理中(两种解释)
- 如何找到最优学习率?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 解决Fatal error in launcher: Unable to create process using '"'
- 责任链设计模式:老哥用程序生孩子
- LAMP架构应用实战—Apache服务介绍与安装01
- Excel合并
- 自定义异常为什么性能差,我来告诉你
- GitHub比较火的springBoot实战项目
- LAMP架构应用实战—Apache服务介绍与安装02
- AWS lambda and dynamodb with Java
- 用设计模式搞定女朋友,吃什么火锅,设计模式不香吗
- LAMP架构应用实战—Apache服务基于IP的虚拟主机配置
- MySQL集群搭建—GTID方式
- MySQL主从复制集群搭建
- LAMP架构应用实战—Apache服务基于端口虚拟主机配置
- MySQL主从复制架构介绍
- MySQL行锁、表锁、间隙锁,你都了解吗