Windows抓屏技术
前3项是主要在使用monitor capture 技术方案。是obs 的实现

文章目录

  • 1. BitBlt (DC)
    • 1.1 调用过程
    • 1.2 优缺点
  • 2.DXGI
    • 2.1 调用流程
    • 2.2 性能对比
    • 2.3 优缺点
  • 3. WGC(Windows Graphics Capture)
  • 4. Mirror driver(win8 之前适用)
  • 5、GDI hook( 适用较少)
  • 6. Windows Media API(依赖SDK 不常用)
    • 优缺点:
  • 7. PrintWindow
  • 8. DWM/Dxgi hook
  • 9. GetWindowDC

1. BitBlt (DC)

目前windows 上最通用的技术方案

1.1 调用过程

  • GetDC(GetDesktokWindow() )获取桌面的DC
  • 然后使用CreateDIBSection创建一个设备无关位图以及内存DC
  • 使用BitBlt把桌面DC的复制到内存DC,这样通过内存DC就能直接获取到原始RGB数据。

1.2 优缺点

优点:GDI函数实现的通用做法,能在所有windows平台实现

缺点:通用归通用,截取的效率则是有点低,尤其是要达到每秒20帧以上的截取,占用CPU有点高,GDI不能获取鼠标,需要在截取的图像中把鼠标画上去。

2.DXGI

Windows8以后微软引入了一套新的接口,叫“Desktop Duplication API”,而由于Desktop Duplication API是通过Microsoft DirectX Graphics Infrastructure (DXGI)来提供桌面图像的,速度非常快。由于是通过GPU,所以cpu占用率很低,性能很高。

2.1 调用流程

  • 创建D3DDevice
  • 通过一系列接口获取路径,获取到IDXGIOutputDuplication接口
  • 调用AcquireNextFrame,获取当前桌面数据,保存在IDXGIResource中
  • 把数据从GPU映射到内存中
  • 拷贝需要的数据到自己的buffer里

这套接口是集成在DirextX之中的,所以更大部分DirectX接口的使用方式基本一致,也就是通过D3D,各种QueryInterface,各种Enum,核心方法,是AcquireNextFrame

获取到IDXGIOutputDuplication接口,是通过如下路径:
IDXGIDevice --> IDXGIAdapter --> IDXGIOutput --> IDXGIOutput1 --> IDXGIOutputDuplication

2.2 性能对比

引用 DXGI快速截屏录屏技术

2.3 优缺点

优点:性能非常好
缺点:只能是windows 8 以上平台

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

3. WGC(Windows Graphics Capture)

是WinRT 提供的接口,obs 中提供了c++ 调用的实现(libwinrt),大家可以自行查看。

从 Windows 10 版本 1803 开始,Windows.Graphics.Capture命名空间提供 API 以从显示或应用程序窗口获取帧,以创建视频流或快照以构建协作和交互体验。

WGC 介绍官网msdn 屏幕截图

4. Mirror driver(win8 之前适用)

从 Windows 8开始,镜像驱动程序将不会安装在系统上

先了解2个基本概念

  • XPDM模型:windows2000以上的系统, 属于XPDM模型的显示驱动,这是个很老的驱动模型,只支持到WinXP系统
  • WDDM模型:Windows Vista (WDDM v1.0) 中引入的图形显示驱动程序体系结构。 从 Windows 8 (wddm v1.0) 开始需要 wddm。

MirrorDriver 这是个驱动截取方法,MirrorDriver就是显示镜像驱动,这个来源于
随着计算机图形技术的发展尤其是3D技术的发展,老的XPDM模型已经不再适应最新3D技术。

该方法也有一些缺点:
a. 涉及到驱动安装, 技术难度大, 系统权限要求也高
b. Win8 上该方案已经失效, 但是还是有方法的, 参见 Remote Display Drivers

5、GDI hook( 适用较少)

这种方法应该说是XP时代比较流行的抓屏方法, 因为所有的绘制都是通过GDI32.dll中的绘图函数来实现的, 所以我们只要拦截了这些函数, 系统的所有绘制就都让我们控制了。这种方法应该来说也是一种挺高效的抓屏方法,屏幕的变化也都能让我们拦截到, 同时因为好多绘图函数是以矢量方式实现的,所有抓到的数据包非常小, 即使在低带宽下也效果挺好。
下面是该方法的一些缺点:
a. Hook技术本身就有其复杂性和不稳定性, 尤其是Hook所有进程
b. Vista越来越多程序采用D2D/D3D绘制, GDI Hook对这些绘制无能为力。
c. Vista之后UAC打开的情况下, 如果我们的程序权限不够高, Hook不到更高权限的程序。

6. Windows Media API(依赖SDK 不常用)

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

优缺点:

优点:如果屏幕录制,可以支持一整套的接口
缺点:是用户机器需要安装Windows Media Encoder 9。

7. PrintWindow

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

8. DWM/Dxgi hook

Vista之后微软放弃了XP时代的XPDM, 采用了全新的WDDM视屏驱动模型, 现在Win8.1上已经是WDDM1.3.
Vista之后底层所有的渲染都是基于D3D技术, 另外我们也知道系统在DWM.exe里进行窗口边框的绘画和合成, 所以理论上我们可以通过HOOK DWM/D3D/DXGI,拦截到整个系统的屏幕内容。当然作为一种Hook技术, 它也有上面GDI Hook类似的问题。

9. GetWindowDC

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

windows - 屏幕抓取技术总结相关推荐

  1. 屏幕抓取程序 (位图DDB的例子)

    屏幕抓取程序的意思是将整个屏幕图显示在应用程序的用户区中,等价于截图. 对桌面窗口的操作: 首先得知道桌面窗口的宽和高,获取宽和高需要利用窗口的设备句柄,而获取设备句柄需要知道窗口句柄,这一系列的连串 ...

  2. 基于Java的阿里妈妈数据抓取技术

    基于Java的阿里妈妈数据抓取技术 前言: 对于需要登录的网站爬虫最大的困难就是需要登录,然后才能获取到数据,如微博,阿里妈妈,webqq等.之前也有看过使用浏览器登录到网站后直接从浏览器中获取coo ...

  3. 内网安全之:Windows 密码抓取

    郑重声明: 本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关.倡导维护网络安全人人有责,共同维护网络文明和谐. Wi ...

  4. ffmpeg 屏幕抓取

    1.在Windows系统使用libavdevice抓取屏幕数据有两种方法:gdigrab和dshow. (1).使用dshow进行屏幕抓取首先要安装:screen capture recorder,下 ...

  5. python爬取慕课视频-Python爬虫抓取技术的门道

    web是一个开放的平台,这也奠定了web从90年代初诞生直至今日将近30年来蓬勃的发展.然而,正所谓成也萧何败也萧何,开放的特性.搜索引擎以及简单易学的html.css技术使得web成为了互联网领域里 ...

  6. Python学习教程:Python爬虫抓取技术的门道

    Python学习教程:Python爬虫抓取技术的门道 web是一个开放的平台,这也奠定了web从90年代初诞生直至今日将近30年来蓬勃的发展.然而,正所谓成也萧何败也萧何,开放的特性.搜索引擎以及简单 ...

  7. python3屏幕抓取程序_python之屏幕抓取

    Tidy 和 HTML 解析 Beautiful Soup 屏幕抓取:是通过程序下载网页并从中提取信息的过程. 简单来见:下载数据并对其进行分析 思路:可使用urllib来获取网页的HTML代码,再使 ...

  8. 天猫、淘宝运营数据抓取技术概述

    对通用网站的数据抓取,比如:谷歌和百度,都有自己的爬虫,当然,爬虫也都是有程序写出来的.根据百度百科的定义:网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动的抓取万维网信息的程序或 ...

  9. python动态捕捉屏幕_python学习(十五) 屏幕抓取

    15.1 屏幕抓取 15.1.1 Tidy和XHTML解析 Tidy:用来修复不规范且随意的HTML文档的工具. 为什么用XHTML: 和旧版本的HTML之间最主要的区别:HTML可能只用一个开始标签 ...

最新文章

  1. Nginx 笔记与总结(15)nginx 实现反向代理 ( nginx + apache 动静分离)
  2. Bootstrap 输入组
  3. 动态规划解题套路框架
  4. Java –从列表中删除所有空值
  5. java线程初始方法三种_Java 多线程 三种实现方式
  6. ExtJs2.0学习系列(9)--Ext.TabPanel之第一式
  7. matlab三角函数化简命令,matlab - Matlab - 类似产品的三角函数简化 - 堆栈内存溢出...
  8. linux然后防止ip欺骗,linux – 如何在iptables中防止ip欺骗?
  9. angular 的进一步深入理解
  10. python3.7.2安装步骤-python安装升级详细步骤 Python2 升级 Python3
  11. mysql导入的sql文件导入到哪里了_mysql导入导出sql文件
  12. Java完全参考手册笔记1
  13. 车牌识别算法介绍与实践
  14. python海龟动画小猫边走边换造型的类
  15. day18 - 正则表达式
  16. 如何关闭谷歌浏览器Google Chrome的阅读清单功能
  17. 【图像原理】rgb数字图片概念
  18. java+mail+authen_javamail实现smtp身份认证
  19. 手机qq如何绑定qq邮箱服务器,iphone怎么绑定qq邮箱
  20. 微信小程序的选择收货地址、新增地址、地址管理等模块的总结(1)

热门文章

  1. Python计算两个日期相差的天数
  2. 局域网中文件或打印机共享服务器,不同局域网,如何实现文件或打印机共享?...
  3. 写代码应该用什么字体?
  4. 质量过剩还意味着什么?
  5. 百度地图API绘制轨迹
  6. 山东科技大学新增计算机专业,山科大新增物联网专业 全国30高校获批此专业...
  7. 关于斜率大于1的中点画线的公式推导
  8. S3 口腔CT设计-任务图
  9. AndroidRuntime java.lang.AbstractMethodError解决方案
  10. 记录下破解企业后台管理系统的简略步骤