引言

最近有一个需要截取当前屏幕,并保存成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. [Mapreduce]eclipse下写wordcount

    上传两个文件到hdfs上的input目录下 代码例如以下: import java.io.IOException; import java.util.StringTokenizer; import o ...

  2. Web之真假分页

    在web设计中一个无法避免的问题就是分页显示.当数据量特别大的时候,我们不可能将全部的数据都在一个页面进行显示,假设这样将严重影响到它的美观性.所以在这个时候,分页显示则成为了我们的大功臣.当然分页也 ...

  3. iOS开发——网络编程Swift篇&(一)网络监测

    网络监测 enum ReachabilityType { case WWAN, WiFi, NotConnected } public class Reachability { /** :see: O ...

  4. Google搜索语法

    原文:http://www.jianshu.com/p/37fe4f1381ef 前言 之前听过一个笑话,有人打开浏览器,输入www.baidu.com, 然后搜索框输入Google,查询google ...

  5. 几个常用myeclipse快捷键

    Ctrl + D:直接删除光标所在行 Alt + ↑:向上移动光标所在行 Alt + ↓:向下移动光标所在行 Ctrl + Alt + ↑:直接向上复制光标所在行内容 Ctrl + Alt + ↓:直 ...

  6. Android(java)学习笔记93:Android布局详解之一:FrameLayout

    FrameLayout是最简单的布局了.所有放在布局里的控件,都按照层次堆叠在屏幕的左上角.后加进来的控件覆盖前面的控件. 在FrameLayout布局里,定义任何空间的位置相关的属性都毫无意义.控件 ...

  7. HTML+CSS实例——漂亮的查询部件(一)

    一.参考网址:www.kuhnsjewelers.com 二.效果: 三.HTML <div id="search-box"> <asp:TextBox ID=& ...

  8. MapReduce的手机流量统计的案例

    程序:(另外一个关于单词计数的总结:http://www.cnblogs.com/DreamDrive/p/5492572.html) import java.io.IOException; impo ...

  9. poj 3264 RMQ

    直接写个RMQ就能过. #include<iostream> #include<cstdio> #include<cstring> #include<algo ...

  10. php 学习笔记

    //本文转自:http://www.cnblogs.com/ronghua/p/6002995.html //语法错误(syntax error)在语法分析阶段,源代码并未被执行,故不会有任何输出. ...