Windows抓屏技术

Windows桌面共享中一些常见的抓屏技术

1. BitBlt

 

我想做Windows开发应该都知道这个API, 它能实现DC间的内容拷贝, 如果我们把源DC指定成Monitor DC或是桌面DC, 它就能实现抓屏功能。

对于通过这种方式的抓屏, 有2点需要特别提醒:

a. 在XP下我们可以通过最后的拷贝标志来控制是否拷贝layered window, 只有SRCCPY表示拷贝内容不包含layered window, 如果是SRCCPY | CAPTUREBLT表示拷贝包括Layered window在内的所有窗口。 这个标志在Vista之后的系统(win7/win8),开启DWM的情况下, 已经失效, 因为这种情况下所有的窗口都是layered window.

b. 这种方式的抓屏在 Vista之后, 开启DWM的情况下, 抓屏速度非常慢(30ms +), 具体原因不知道是因为系统没有缓存整个屏幕的数据还是GPU向内存拷贝数据太慢了, 有知道的朋友可以提示下。

2. Mirror driver

 

这种方法应该是Win8之前最高效的抓屏方法, 也是微软推荐的远程桌面共享方案,它通过创建虚拟镜像驱动, 直接获取最终屏幕变化数据。

该方法也有一些缺点:

a. 涉及到驱动安装, 技术难度大, 系统权限要求也高

b. Win8 上该方案已经失效, 但是还是有方法的, 参见 Remote Display Drivers

3. GDI hook

 

这种方法应该说是XP时代比较流行的抓屏方法, 因为所有的绘制都是通过GDI32.dll中的绘图函数来实现的, 所以我们只要拦截了这些函数, 系统的所有绘制就都让我们控制了。这种方法应该来说也是一种挺高效的抓屏方法,屏幕的变化也都能让我们拦截到, 同时因为好多绘图函数是以矢量方式实现的,所有抓到的数据包非常小, 即使在低带宽下也效果挺好。

下面是该方法的一些缺点:

a. Hook技术本身就有其复杂性和不稳定性, 尤其是Hook所有进程

b. Vista只有越来越多程序采用D2D/D3D绘制, GDI Hook对这些绘制无能为力。

c. Vista之后UAC打开的情况下, 如果我们的程序权限不够高, Hook不到更高权限的程序。

4. Windows Media API

 

Windows Media 9.0 支持用Windows Media Encoder 9 API来抓屏。它有一个编码器叫Windows Media Video 9 Screen codec,特别为抓屏优化过。Windows Media Encoder API提供了一个IWMEncoder2接口可以用来高效地捕捉屏幕图像。

因为对这组API不熟, 这种抓屏方法我也没尝试过, 具体可见Various methods for capturing the screen, 感觉这种方法的最大缺点是用户机器需要安装Windows Media Encoder 9。

5. DirectX

每个DirectX程序都包含一个被我们称作缓冲的内存区域,其中保存了和该程序有关的显存内容,这在程序中被称作后台缓冲(Back Buffer),有些程序有不止一个的后台缓冲。还有一个缓冲,在默认情况下每个程序都可以访问-前台缓冲。前台缓冲保存了和桌面相关的显存内容,实质上就是屏幕图像。 我们的程序通过访问前台缓冲就可以捕捉到当前屏幕的内容。上面的列子中也包含该方法的实现, 是基于DirectX9的,我们可以参考下, 据我测试该方法在DWM打开的情况下抓整屏也要30ms左右。Vista之后的DirectX 10/11相对于DirectX 9 已经发生非常大的变化, 直接用新的接口上面的代码未必能正常工作。


6. PrintWindow

 

该方法本身不能直接做为一种抓屏方法, 但是有时候我们要获取某个窗口的内容, 即使他被其他窗口覆盖着, 这时候这个函数就很有用。该方该调用法的原理是通过给目标窗口发送WM_PRINT或是WM_PRINTCLIENT消息, 所以如果目标窗口没有响应, 该调用可能会阻塞抓屏线程, 这种情况下抓屏前最好先用SendMessageTimeout检测目标窗口是否有响应。另外该方法也抓不到D3D窗口的内容。


7. DWM/Dxgi hook

 

Vista之后微软放弃了XP时代的XPDM, 采用了全新的WDDM视屏驱动模型, 现在Win8.1上已经是WDDM1.3.

Vista之后底层所有的渲染都是基于D3D技术, 另外我们也知道系统在DWM.exe里进行窗口边框的绘画和合成, 所以理论上我们可以通过HOOK DWM/D3D/DXGI,拦截到整个系统的屏幕内容。当然作为一种Hook技术, 它也有上面GDI Hook类似的问题。

8. Magnification

 

这组API是微软Vista之后开放给我们开发放大镜程序的, 它里面提供了一个API让我们拦截到显示的内容, 可惜的是这个关键的API  MagSetImageScalingCallback 微软已经宣布作废。另外该方式的抓屏效率也不高, 整屏需要60 ms 左右。

9. Desktop Duplication  

 

这是微软Win8 上宣布放弃Mirror driver之后推荐采用的抓屏技术, 全部基于D3D/DXGI技术, 效率非常高, 并且包含变化区域和屏幕鼠标光标。它的缺点是没法抓取某个窗口的内容 。

10. GetWindowDC 

该方法和PrintWindow类似,但是它没有PrintWindow的权限问题, 也没有超时问题。
这种抓屏方法在Win7/Win8  DWM打开的情况下抓屏,结果会颠覆我们XP时代的知识, 因为即使窗口被覆盖, 它也可以正确抓取到被覆盖窗口下的内容, WebRTC正是用这种方式来Share  Application的。
它的主要问题是有些窗口抓到的内容不包含非客户区,有些窗口比如任务栏的Thumbnail窗口会抓不到内容。

http://www.cppblog.com/weiym/archive/2013/12/01/204536.html

时间: 2024-09-29 16:18:10

Windows抓屏技术的相关文章

MATLAB抓屏例子临时

摘要 :结合如何用window API实现matlab屏幕抓取函数,介绍了在matlab中如何利用matlab与C/C++的接口,调用操作系统API,扩展matlab功能. 引言 MATLAB 产品家族是美国 MathWorks公司开发的用于概念设计,算法开发,建模仿真,实时实现的理想的集成环境.由于其完整的专业体系和先进的设计 开发思路,使得 MATLAB 在多种领域都有广阔的应用空间. 尽管MATLAB在科学研究以及工业技术开发方面有着极为广泛的应用,但是它也不是万能的.在某些场合下,MAT

方别《QQ群霸屏技术》,又见《QQ群建群细则》

规则,时刻变动;QQ群系列,咱们再来一轮. QQ群霸屏技术,你说建群貌似很菜,大家仿佛都知道,其实只知其一不知其二. QQ群类别 群分类,常规的就以下几种. 普通群. 建群随意,偏个性化,一言不合就拉人进群,营销的话大多分类会选择品牌产品,这个是霸屏系列的核心推荐. 普通群,是前期笔者对霸屏系列常规的基础打法,规则背后,咱慢慢完善. 同城群. 三类:私密群.同城群.兴趣群. 同城群会被推荐,但是如果没运营,后续不会被推荐.隔三差五的互动,市场的打理,是必须的. 2.1.推荐 群地点附近,附近的群

Windows蓝屏错误代码解释

windows蓝屏错误代码解释 1 0×00000001 不正确的函数.2 0×00000002 系统找不到指定的档案.3 0×00000003 系统找不到指定的路径.4 0×00000004 系统无法开启档案.5 0×00000005 拒绝存取.6 0×00000006 无效的代码.7 0×00000007 储存体控制区块已毁.8 0×00000008 储存体空间不足,无法处理这个指令.9 0×00000009 储存体控制区块地址无效.10 0×0000000A 环境不正确.11 0×0000

Windows蓝屏了怎么办?

说到蓝屏,可能很多朋友会深恶痛绝,颇多诟病,甚至还有歪诗曰"补丁与漏洞齐飞,死机共蓝屏一色"... 其实这是一种误解,蓝屏实际上是Windows的"维稳"手段,当发生严重故障时,就要壮士断腕.挥泪斩马谡.而不能欲盖弥彰.阻止上访.以下是盆盆曾经在电梯里看到的蓝屏.嗯,说到电梯,华来四里的程尊华老师曾经和盆盆说过,他小时的理想就是:坐电梯上下楼.坐地铁上下班.现在完全可以问一句:成功其庶几乎? 以下是一个比较著名的Windows蓝屏场景,您懂的... 一提到蓝屏,印象

Windows蓝屏死机骗局:新的恶意钓鱼方式

新的恶意骗局:恶意软件的制作者们,劫持了Windows系统中的最让人崩溃的蓝屏死机,制造了钓鱼骗局. 搜索引擎广告的恶意利用 近日,有安全团队发现一种新的恶意入侵方式正在扩散,他们利用蓝屏死机的假象,诱使用户付款,甚至套取用户身份认证信息. 众所周知,在线搜索引擎在日常生活中被成千上万的网友所使用,给人们的生活也带来极大便利.而为了更好的接收和处理大量的搜索请求,搜索引擎的提供商--如谷歌.雅虎.微软提供了一个广告平台,以商业化方式来运行这个平台.用户将会在搜索结果页面的前端看到提供了赞助的企业

Python爬虫抓取技术的门道

web是一个开放的平台,这也奠定了web从90年代初诞生直至今日将近30年来蓬勃的发展.然而,正所谓成也萧何败也萧何,开放的特性.搜索引擎以及简单易学的html.css技术使得web成为了互联网领域里最为流行和成熟的信息传播媒介:但如今作为商业化软件,web这个平台上的内容信息的版权却毫无保证,因为相比软件客户端而言,你的网页中的内容可以被很低成本.很低的技术门槛实现出的一些抓取程序获取到,这也就是这一系列文章将要探讨的话题-- 网络爬虫 . 有很多人认为web应当始终遵循开放的精神,呈现在页面

Windows Server 2016技术预览

Windows Server 2016是微软将于2016年9月份发布的最新服务器操作系统.目前微软官方发布了许多Windows Server 2016新的功能和特性,下面我们来简单看下: 主要内容 预览版界面 系统需求及安装 服务器管理变化 新特性及变化 预览版界面 服务器界面,沉浸而不渲染 登录界面,色调变得活泼起来,用户图像由原先Windows2012的方块变成圆形 继续 进入系统,乍一看,以为是WIN10呢,注意右下角 如此做法,似乎在传递win10的最佳服务器系统就是他了 开始菜单,Al

吐血分享:QQ群霸屏技术教程2017(问题篇)

霸屏技术,问题篇后,暂时搁置,尔望后续. 这里针对操作中,经常遇到的问题,做个简单整理. 回忆下,排名流程. 1.建群,品牌产品群,做任何关键词都是品牌产品群,皆因其有独特的优势. 2.拉人,填充群人数. 3.优化,关键词细节处理好. 4.解散,拉人的后置问题,解散,然后恢复,恢复后群介绍是空白的,2个小时后,完善好资料,再隔5个小时,重新用定位软件,整体的把群(介绍.名称.位置.分类)修改一遍. 排名,其后就坐等排名,80%的行业这个方式就可以做上首页. 5.竞争度的原因,可能排不上来,这个时

吐血分享:QQ群霸屏技术教程(利润篇)

QQ群技术,不论日进几百,空隙时间多的可以尝试,日进100问题不大. QQ群技术,如何赚钱,能赚多少钱?不同行业,不同关键词,不同力度,不一样的产出. 群费 群费,这个和付费群是有区别的,群费在手机端显示. QQ群费,这个常见于一些兴趣群.同城群之类的,等同于份子钱,比如聚个会,结伴游啥的. 1.手机端,以群主的身份点开自己的群. 2.点击右上角的群成员图标. 3.点击更多,进入群应用,找到群费. 4.点击发布群费,设置金额. 5.群费发布后,会显示到QQ群中,这个操作只有群主可以做. 群费,这