引言

最近有一个需要截取当前屏幕,并保存成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. 关于android开发添加菜单XML文件之后无法在R.java中生成ID的问题

    因为和同学分开做的android软件,现在想整合他做的界面部分,于是拷贝了res和src文件夹的文件,其中包括一个res.menu文件夹中的XML.但是每次将该文件导入到工程总无法自动在R.java中 ...

  2. iOS6 / iOS7 状态栏高度适配

    问题原因:iOS7的状态栏(status bar)不再占用单独的20px,所以假设你在iOS6上的界面布局是正常的,那么到了iOS7上就会变成以下这个样子:             左边是iOS6界面 ...

  3. SqlDependency缓存数据库表小案例

    SqlDependency的简介: SqlDependency是outputcache网页缓存的一个参数,它的作用是指定缓存失效的数据库依赖项,可以具体到数据库和表. SqlDependency能解决 ...

  4. VirtualBOX 虚拟机安装 OS X 10.9 Mavericks 及 Xcode 5,本人X220亲测

    原文链接:http://bbs.weiphone.com/read-htm-tid-7625465.html 建议电脑要求    Windows 7/8, 32 / 64 bit    CPU Int ...

  5. A Brief Introduction to the Design of UBIFS

    http://pan.baidu.com/s/1dDy0jip 译文:http://blog.csdn.net/kickxxx/article/details/6573396 项目闲暇,想了解下UBI ...

  6. DataBase 之 实用积累

    (1)分页:(性能效果最好的是top/max 和Row_number()两种方法) [1]写法1,not in/top select top pagesize * from pagetest wher ...

  7. 用VB操作Excel的方法

    VB是常用的应用软件开发工具之一,由于VB的报表功能有限,而且一但报表格式发生变化,就得相应修改程序,给应用软件的维护工作带来极大的不便.因此有很多程序员现在已经充分利用EXECL的强大报表功来实现报 ...

  8. Josephina and RPG

    Josephina and RPG Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  9. cocos2d-x, protobuf, no config.h, #error "No suitable threading library available."

    在用cocos2d-x3.2 + protobuf编译Android项目的时候,protobuf出现了两个问题: 1. 首先是config.h找不到,查阅自后说是通过命令或工具生成的,里面的内容根据不 ...

  10. [课程相关]homework-07

    我读的博客: C++11中值得关注的几大变化 C++11 中的线程.锁和条件变量 C++开发者都应该使用的10个C++11特性 开始使用C++11的9个理由 我的问题: 1.有一句话:“C++像难懂的 ...