C++运用SDK截屏
引言
最近有一个需要截取当前屏幕,并保存成BMP文件的需求。整个需求,拆分成三步:1、截取屏幕,获得位图数据。2、配合bmp文件结构信息,将数据整合。3、对整合后的数据做操作,如保存在本地、通过网络传送至服务器等。
截屏
我选用的是BitBlt这个windows API作为截取图片的方法,该方法的详细信息参考这里,详细代码如下:

首先获得屏幕的HDC,通过GetDC()这个API,接着创建一个兼容HDC,即comHDC,用来在内存里表示截取的位图的上下文。 后面两行代码分别是获得屏幕的宽度和高度。然后用CreateCompatibleBitmap这个API创建一个兼容的HBITMAP,即我们的位图句柄。创建好后,我们将其作为comHDC的选中位图句柄(在这里,我不知道怎么措辞了,如果专门的措辞,请告知。)。然后调用BitBlt,将hDC即屏幕的位图复制到comHDC即hBitmap中。至此,我们已经获得到所需位图数据的全部信息。
BMP文件结构信息
bmp文件需由三部分组成:文件头(BITMAPFILEHEADER),位图信息头(BITMAPINFOHEADER)、位图数据。我们将这所有的数据写入硬盘的时候,需要按照顺序依次将三个部分写入。文件头和位图信息头是按照HBitmap以及它的HDC来构造的。构造文件头的代码如下:

其中width和height为上文得到的屏幕宽高,其他数值请参考MSDN。
位图信息头的构造,代码如下:

得到位图数据的代码如下:

在这里主要运用GetDIBits来获得数据,存储在lpbitmap里面。至此,我们获得了所有的需要的数据:bmiHeader(文件头)、bmfHeader(位图信息头)、lpbitmap(位图数据)。
整合数据
我们先来谈谈保存至硬盘。由于需要写入文件元信息,我们需要用二进制的方式写文件,运用C++标准库,代码如下:

此时,就可以在项目目录里面获得一个存有当前屏幕快照的bmp文件了。

现在,我们发挥一下想象力,如果这段程序运行在别人的电脑上,通过这段程序,我们获得了他or她的屏幕快照,为了避免被发现这些操作,我们不能保存这些数据在硬盘上,直接将这些数据传到我们这……。我们可以整合这些数据,将它们存放在任何我们想要存放的地方:DB,服务器,硬盘等等。我们将所有的数据整合成一个二进制数据块:

现在,所有的信息都放在allData里面了, 我们可以写入文件:

可以通过socket传送到网络的另一端,然后再保存,也可以直接存入数据库。whatever u want!
总结
C++在底层用起来非常方便,可以随意转换数据,只要我们确定数据的结构及其大小即可。代码我就不上传了,非常短,别忘了释放new出的内存以及创造的兼容HDC等资源哦。
C++运用SDK截屏的更多相关文章
- Android手机截屏
刚开始打算做一个简单的截屏程序时,以为很轻松就能搞定. 在Activity上放一个按钮,点击完成截屏操作,并将数据以图片形式保存在手机中. 动手之前,自然是看书和网上各种查资料.结果发现了解的知识越多 ...
- Android开发笔记:安卓程序截屏方法
1,基于Android SDK的截屏方法 (1)主要就是利用SDK提供的View.getDrawingCache()方法.网上已经有很多的实例了.首先创建一个android project,然后进行L ...
- iOS中正确的截屏姿势
昨天写了个用到截屏功能的插件,结果问题不断,今天终于解决好了,把debug过程中所有尝试过的截屏方法都贴出来吧- 第一种 这是iOS 3时代开始就被使用的方法,它被废止于iOS 7.iOS的私有方法, ...
- adb获得安卓系统版本及截屏
[时间:2017-09] [状态:Open] [关键词:adb, android,系统版本,截屏,screencap] 本文主要是我遇到的android命令行用法的一个简单总结 系统版本 获取系统版本 ...
- Android 截屏与 WebView 长图分享经验总结
最近在做新业务需求的同时,我们在 Android 上遇到了一些之前没有碰到过的问题,截屏分享. WebView 生成长图以及长图在各个分享渠道分享时图片模糊甚至分享失败等问题,在这过程中踩了很多坑,到 ...
- android4.3 截屏功能的尝试与失败分析
1.背景 上一篇讲了在源码中捕获到了android手机的截屏函数(同时按下电源键与音量减,详情http://blog.csdn.net/buptgshengod/article/details/199 ...
- iOS 百度地图截屏
关于百度地图截屏的问题,发现不能用常用的方法进行载屏,常用的截屏方法所得到的图片地图瓦片底图会显示空白,网上给出的答案是这样的 :因为百度地图不是用UIKit实现的,所以得不到截图! 不过通过Open ...
- Javascript网页截屏的方法
最近我在研究开发一个火狐插件,具体的功能是将网页内容截屏并分享到微博上.目前基本功能已经实现,大家可以在 @程序师视野 里看到用这个截图插件分享的微博的效果. 之前我曾写过如何将canvas图形转换成 ...
- Web截屏插件
官方网站:http://www.ncmem.com 官方博客:http://www.cnblogs.com/xproer 产品首页:http://www.ncmem.com/webplug/scppr ...
随机推荐
- 【剑指offer】近期公共祖先
转载请注明出处:http://blog.csdn.net/ns_code/article/details/28113959 剑指offer上的最后一题了,一个递归函数调了一下午,才得到正确的结果. 题 ...
- 2.目录:疯子讲iOS课程
目录:疯子讲iOS课程 写这个目录让我纠结好几天,一是我在考虑要不要从Objective-c基础开始讲,是否要使用ARC的方式讲,二是本人的游戏这几天正在封测,时间也比较紧张.纠结于有些朋友可能还不了 ...
- 自己动手写CPU之第九阶段(8)——MIPS32中的LL、SC指令说明
将陆续上传新书<自己动手写CPU>,今天是第47篇. 9.7 ll.sc指令实现思路 9.7.1 实现思路 这2条指令都涉及到訪问链接状态位LLbit,能够将LLbit当做寄存器处理,ll ...
- ZOJ1109_Language of FatMouse(STL/map)
解题报告 题意: 略. 思路: map应用. #include <algorithm> #include <iostream> #include <cstring> ...
- Python 学习之二:Python超短教程
前言 本教程综合Stanford CS231N和UC Berkerley CS188的Python教程. 教程非常短,但适合有一定编程基础.学过其它语言的童鞋. Python 启动Python 解释器 ...
- JSONP(处理跨域问题)
Ajax直接请求普通文件存在跨域无权限访问的问题 凡是拥有"src"这个属性的标签都拥有跨域的能力,比如<script>.<img>.<iframe& ...
- NSURLConnection、NSURLSession
NSURLConnection 1.准备网络资源地址:URL 注意:由于URL支持26个英文字母,数字和少数的几个特殊字符. 因此对于URL中包含非标准URL的字符,需要进行编码. iOS提供了函 ...
- SQL in与exists相关性能问题总结
SQL in与exists相关性能问题总结 in 和 exists in 和 exists的是DBA或开发人员日常工作学习中常用的基本运算符,今天我就这两个所带来的性能问题进行分析总结,方便自己与他 ...
- Java操作Wrod文档的工具类
需要有jacob的jar包支持 import java.util.Iterator; import java.util.List; import java.util.HashMap; import c ...
- Jquery 全选、反选问题解析
最近工作中,需要使用Jquery实现复选框的全选和反选,本人虽然不是专职撸前端的,但这个小问题感觉也没什么难度,下面直接上代码: <div id="list"> < ...