引言

最近有一个需要截取当前屏幕,并保存成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截屏的更多相关文章

  1. Android手机截屏

    刚开始打算做一个简单的截屏程序时,以为很轻松就能搞定. 在Activity上放一个按钮,点击完成截屏操作,并将数据以图片形式保存在手机中. 动手之前,自然是看书和网上各种查资料.结果发现了解的知识越多 ...

  2. Android开发笔记:安卓程序截屏方法

    1,基于Android SDK的截屏方法 (1)主要就是利用SDK提供的View.getDrawingCache()方法.网上已经有很多的实例了.首先创建一个android project,然后进行L ...

  3. iOS中正确的截屏姿势

    昨天写了个用到截屏功能的插件,结果问题不断,今天终于解决好了,把debug过程中所有尝试过的截屏方法都贴出来吧- 第一种 这是iOS 3时代开始就被使用的方法,它被废止于iOS 7.iOS的私有方法, ...

  4. adb获得安卓系统版本及截屏

    [时间:2017-09] [状态:Open] [关键词:adb, android,系统版本,截屏,screencap] 本文主要是我遇到的android命令行用法的一个简单总结 系统版本 获取系统版本 ...

  5. Android 截屏与 WebView 长图分享经验总结

    最近在做新业务需求的同时,我们在 Android 上遇到了一些之前没有碰到过的问题,截屏分享. WebView 生成长图以及长图在各个分享渠道分享时图片模糊甚至分享失败等问题,在这过程中踩了很多坑,到 ...

  6. android4.3 截屏功能的尝试与失败分析

    1.背景 上一篇讲了在源码中捕获到了android手机的截屏函数(同时按下电源键与音量减,详情http://blog.csdn.net/buptgshengod/article/details/199 ...

  7. iOS 百度地图截屏

    关于百度地图截屏的问题,发现不能用常用的方法进行载屏,常用的截屏方法所得到的图片地图瓦片底图会显示空白,网上给出的答案是这样的 :因为百度地图不是用UIKit实现的,所以得不到截图! 不过通过Open ...

  8. Javascript网页截屏的方法

    最近我在研究开发一个火狐插件,具体的功能是将网页内容截屏并分享到微博上.目前基本功能已经实现,大家可以在 @程序师视野 里看到用这个截图插件分享的微博的效果. 之前我曾写过如何将canvas图形转换成 ...

  9. Web截屏插件

    官方网站:http://www.ncmem.com 官方博客:http://www.cnblogs.com/xproer 产品首页:http://www.ncmem.com/webplug/scppr ...

随机推荐

  1. CSS里的单位

    CSS中预设了16种颜色以及16种颜色的衍生色,这16种颜色是CSS规范推荐的.并且一些主流的浏览器都可以识别.例如以下表所看到的: 十六进制颜色是最经常使用的定义方式.它的基本格式为#RRGGBB, ...

  2. 偶然发现关于网页JavaScript脚本无法正常运行的原因

    客户常常打电话投诉公司的销售系统有问题, 后来发现有的客户直接把网址设为受限网站,才导致系统无法正常执行.改动后正常.

  3. cardsui-for-android

    https://github.com/Androguide/cardsui-for-android cardsui-for-android-master.zip

  4. 搭建Nginx图片服务器

    搭建Nginx图片服务器 Part-I 安装Nginx 安装PCRE 下载 ngx_cache_purge 并解压,用来清除缓存 下载Nginx并解压 cd nginx-1.7.7 编译,--pref ...

  5. XCode帮助文档离线下载解决办法

    1.菜单栏Xcode->Preferences选择Documentation,在线下载 2.离线下载(用迅雷即可下载) 在上述在线下载列表中,点击某一列,下拉框可看见 info,可得到其网络所在 ...

  6. win7系统激活最简单方法

    利用激活工具快速激活WIN7系统! 工具/原料 小马Oem7.未激活的WIN7系统 步骤/方法 1 复制BT种子 http://www.pccppc.com/download/oem7F.rar粘贴到 ...

  7. 【天池大数据赛题解析】资金流入流出预测(附Top4答辩ppt)

    http://mp.weixin.qq.com/s?__biz=MzA3MDg0MjgxNQ==&mid=208451006&idx=1&sn=532e41cf020a0673 ...

  8. 谷歌chrome浏览器桌面提醒 webkitNotifications

    原创: //点击时开启提醒 $(".message_alert").toggle(function(){ $(".message_alert_tip").htm ...

  9. 并发MD5计算方法

    MD5与SHA算法一样,利用他们可以计算某段数据的唯一hash值,常用做校验码.而MD5比SHA算法性能高.在我参加的一个项目中,主要用MD5码值来去重,因此对计算性能要求较高.网上有对MD5算法并行 ...

  10. 关于Object[]数组强转成Integer[]类型的数组.

    为什么不能由Object[]数组强转成Integer[]数组. Object[] ins= { new Integer(0), new Integer(1), new Integer(2), new ...