C++捕获全屏(截全屏)
函数:捕获全屏图片
参数:LPRECT lpRect 图片大小
返回:HBITMAP hBitmap
HBITMAP CopyScreenToBitmap(LPRECT lpRect)
{HDC hScrDC, hMemDC;HBITMAP hBitmap, hOldBitmap;int nX, nY, nX2, nY2;int nWidth, nHeight;int xScrn, yScrn;if (IsRectEmpty(lpRect))return NULL;hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);hMemDC = CreateCompatibleDC(hScrDC);nX = lpRect->left;nY = lpRect->top;nX2 = lpRect->right;nY2 = lpRect->bottom;xScrn = GetDeviceCaps(hScrDC, HORZRES);yScrn = GetDeviceCaps(hScrDC, VERTRES);if (nX < 0)nX = 0;if (nY < 0)nY = 0;if (nX2 > xScrn)nX2 = xScrn;if (nY2 > yScrn)nY2 = yScrn;nWidth = nX2 - nX;nHeight = nY2 - nY;hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY);hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);DeleteDC(hScrDC);DeleteDC(hMemDC);return hBitmap;
}
函数:将Bitmap另存为文件
参数:HBITMAP hBitmap 图片数据
LPSTR lpFileName 文件路径名称
返回:成功/失败
bool SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName)
{ HDC hDC;int iBits;WORD wBitCount;DWORD dwPaletteSize = 0, dwBmBitsSize, dwDIBSize, dwWritten;BITMAP Bitmap;BITMAPFILEHEADER bmfHdr;BITMAPINFOHEADER bi;LPBITMAPINFOHEADER lpbi;HANDLE fh, hDib, hPal;HPALETTE 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 <= 8)wBitCount = 8;else if (iBits <= 24)wBitCount = 24;elsewBitCount = 32;if (wBitCount <= 8)dwPaletteSize = (1 << wBitCount) * 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(BITMAPINFOHEADER));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, hOldPal, TRUE);RealizePalette(hDC);::ReleaseDC(NULL, hDC);}fh = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);if (fh == INVALID_HANDLE_VALUE)return FALSE;// 设置位图文件头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, sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize, &dwWritten, NULL);GlobalUnlock(hDib);GlobalFree(hDib);CloseHandle(fh);return TRUE;
}
调用方法:
bool ScreenshotRect(LPRECT rect, LPSTR lpFileName, CString& strErrmsg)
{HBITMAP hMap = CopyScreenToBitmap(rect); //捕获图片if (hMap != nullptr){bool bSuccessSaveBitmp = SaveBitmapToFile(hMap, lpFileName); //保存图片DeleteObject(hMap);if (!bSuccessSaveBitmp){strErrmsg = "截图存储失败!";}return bSuccessSaveBitmp;}else{strErrmsg = "截图失败";return false;}
}
C++捕获全屏(截全屏)相关推荐
- 谷歌浏览器如何截全屏图片?
有时候想要截取浏览器全屏,谷歌浏览器自带截取全屏命令,操作步骤如下: 1.按住键盘的F12或者是空白处点击鼠标右键找到检查项 2.按住ctrl+shift+p,会出现搜索框的界面 3.搜索框中输入sc ...
- 上传文件、视频、图片、全选、全不选、截屏直接粘贴图片
上传文件.视频.图片.全选.全不选.截屏直接粘贴图片 控制器代码:ObUnitsController.php <?phpnamespace App\Admin\Controllers;use A ...
- EasyClick 截全屏图压缩
EasyClick 截全屏图压缩 随便瞎写,请勿喷. 效果图 tmp.jpg是压缩后的图片,原图是截屏直接保存的图片 720X1280分辨率 1440X2560分辨率 js 部分代码 /** Copy ...
- 谷歌浏览器截图截全屏
谷歌浏览器截图截全屏 F12打开控制台 输入ctrl+shift+p 再输入full,然后回车,即可截取全屏图片
- mac上投屏android_全平台Win/Mac全设备Android/iOS 免费无线投屏神器
東笙资源部落 [特别声明]所有软件皆来源于网上收集整理,所分享资源只做日常学习和交流使用,版权归原作者或原网站所有.不得用作其它用途,如有侵犯你的权益,请联系我们,将于24小时内进行删除,谢谢你的配合 ...
- c语言 游戏全屏,常用电脑快捷键全及游戏全屏问题.doc
常用电脑快捷键全及游戏全屏问题 常用电脑快捷键大全 按"shift"+"6" 是省略号--, 方法:shift+6(主键盘上的6,就是Y键对上去的那个6),前提 ...
- yota3墨水屏设置_【YotaPhoneYOTA3评测】外观:没有全面屏但有墨水屏_YotaPhone YOTA 3_手机评测-中关村在线...
外观:没有全面屏但有墨水屏 如果没有背面这块5.2英寸的电子墨水屏幕,也许你并不能发现YOTA3墨知版的特别之处,而加上这块墨水屏后,你一眼甚至都分不出哪是正面,哪是背面.同样都是2.5D玻璃,同样超 ...
- android dialog 横向全屏,Dialog全屏,去掉状态栏的方式
dialog即使设置全屏了,但还是有状态栏占用高度这: 直接将下面这行代码放到你的dialog中即可 @Override protected void onStart() { super.onStar ...
- 远程桌面退出全屏/不能全屏/全屏切换的技巧
远程桌面退出全屏/不能全屏/全屏切换的技巧退出全屏 问:我的电脑远程登录到服务器上并且切换到了全屏状态,全屏后发现桌面顶部没有浮动工具栏了,想退出全屏状态,不知如何退出了,最后,只有重启电脑.想知道如 ...
最新文章
- 简单安装与使用composer
- 【深度学习】一个应用—肝脏CT图像自动分割(术前评估)
- Scala操作外部数据
- 如何确定Oracle是32 Bit(位)的还是64 Bit(位)的?
- Discuz! X2.5 添加自定义数据调用模块
- leetcode -39组合总数
- { parser: babylon } is deprecated; we now treat it as { parser: babel }.
- 将多张连续的静态图转成gif动态图
- python之路 -- 并发编程之线程
- 强大的反编译软件Hopper Disassembler for Mac控制流程图详解
- mysql数据库学习汇总
- 小学计算机课评课稿,小学信息技术评课稿课件
- 【文化课每周学习记录】2019.4.7——2019.4.13
- 挺有意思的文章。。。
- 小白的破解WiFi之路1----VMware、kali安装
- java jcp_太久了,JCP:Eclipse考虑了新的Java规范流程
- 微信公众号开发者原生态的servlet
- parameter缩略语_通信缩略语和术语
- 高校计算机专业实践教学改革研究,民族高校计算机专业实践教学改革
- 用Python做了一个 盯盘机器人,股票价格实时监控,还能邮件通知你!
热门文章
- 继小米机器狗、特斯拉机器人后,小鹏汽车发布智能机器马:真的能骑!
- 【腾讯Bugly干货分享】程序员们也该知道的事——“期权和股票”
- python语言表白语句简单_简短的表白语句280句
- 面向未来,镭速助力企业构建文件安全外发新生态
- Android 动画之一 Drawable Animation —— 逐帧(Frame)动画
- 《论语》原文及其全文翻译 学而篇1
- app消息推送(ios/android)基础知识
- CTF MISC系列————8、Misc1-纵横四海
- 社区检测(网络分析)(图聚类)---进阶概念解析
- Hive输出文件的间隔符