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窗口会抓不到内容。


最后简单总结下 , 我们可以看到Windows系统上基本没有一种通用的抓屏技术可以高效的抓取所有的系统(XP/Win7/Win8), 很大一部原因是操作系统的显示驱动模型在从XPDM向WDDM转变, 应用层的API也在从GDI向D3D转变 。 相对于Linux的稳定, Window的不断发展和进步, 对开发人员究竟是喜是悲?
Hook函数三步走(SetWindowsHookEx、UnhookWindowsHookEx、CallNextHookEx) 文章目录Hook(Windows系统机制)Hook定义Hook原理系统钩子与线程钩子钩子函数设置钩子: SetWindowsHookEx参数说明:释放钩子: UnhookWindowsHookEx继续钩子: CallNextHookExHook小案例 Hook(Windows系统机制) Hook定义 Hook是Windows中提供的一种用以替换DOS下“中断”的系统机制,中文译为“挂钩”或 “钩子” 。 在对特定的系统事件进行hook后,一旦发生已hook事件,对该事件进行hook的程 序就会收到系统的通 阅读详情

相关推荐

uDesktopDuplication:Unity的桌面复制API实现(仅适用于Windows 810)

uDesktopDuplication uDesktopDuplication是Unity资产,可使用Desktop Duplication API将实时屏幕截图用作Texture2D 。 屏幕截图 环境 Windows 8/10 Unity 5 安装 请从下载最新的uDesktopDuplication.unitypackage 。 用法 将uDesktopDuplication/Texture组件附加到目标对象,然后将其主要纹理替换为捕获的屏幕。 请查看示例场景以获取更多详细信息。 执照 MIT许可证(MIT) 版权所有(c)2016 hecomi 特此免费授予获得该软件和相关文档

【亲测免费】 探索DWMHook:一个强大的Windows系统钩子库

探索DWMHook:一个强大的Windows系统钩子库 项目简介 是一个开源项目,由开发者mfxiaosheng创建。它是一个用于Windows桌面窗口管理器(DWM)的钩子库,允许程序员深入操作系统层面,实现自定义的窗口行为和增强用户体验。通过此库,你可以轻松地操作窗口边缘拖动、缩放以及其他DWM特性。 技术分析 DWMHook的核心是利用微软的Desktop Window Manager (D...

gitblog_00071的博客 1276

Zynq工程IP核封装:XCI引用与约束继承实战指南

IP核封装是FPGA系统设计中实现模块复用、团队协作与技术资产沉淀的关键环节。其本质是将功能逻辑、时序约束、接口协议和硬件配置统一抽象为可配置、可验证、可演进的标准化组件。核心原理在于通过XCI文件保留IP核的参数化定义能力,依托Vivado IP Packager实现约束继承、端口自动映射与时钟域解耦,从而保障跨项目集成的时序可信性与约束完备性。该技术广泛应用于Zynq SoC视频处理、高速接口(如HDMI/TMDS)、多时钟域控制系统等场景,尤其在需要长期维护与版本迭代的工业级嵌入式开发中具有不可替代的

weixin_42593701的博客 123

SpringBoot+Vue图书馆管理系统毕业设计:从CRUD到企业级业务闭环

在软件开发领域,业务系统设计是连接用户需求与技术实现的核心环节。其基本原理在于通过模块化、分层架构将复杂业务流程拆解为可管理的组件,确保数据流与业务逻辑的清晰性。这一过程的技术价值在于构建出高内聚、低耦合、易于维护和扩展的应用系统,从而支撑稳定的用户体验和高效的后台管理。典型的应用场景包括电商平台、OA办公系统以及各类资源管理平台。本文聚焦于图书馆管理系统这一经典案例,深入探讨如何利用SpringBoot和Vue技术栈,超越基础的增删改查(CRUD),实现涵盖智能检索、完整借阅流程、精细化管控和数据可视化统

weixin_34268169的博客 486

项目计划书、规划文档模板

项目计划书、规划文档模板 最近通过项目实践经历,整理出的一套项目计划书(仅供自己参考梳理思路使用) 有喜欢的文末加VX 辛苦码字如有转载请标明出处谢谢!——木研 更新的简版项目规划文档! 原版文件请+vx :baierfa ...

weixin_43194923的博客 987

2025年情感分析(SA)综述——论文阅读报告

2025年情感分析(SA)综述——论文阅读报告

Samdy_L的博客 2086

Windows抓屏技术分析

DXGI和WGC抓屏

weixin_41119173的博客 910

泰凌微8258入门教程 基础篇①——Bluetooth® SIG Mesh 快速上手

Bluetooth® SIG Mesh Quick Start

6729

音视频PaaS平台基于Windows的抓屏技术

众所周知,屏幕共享是实时音视频互动中十分重要的一项功能,能够帮助参会者访问另一台计算机或桌面的内容,从而实现文档、图片、多媒体等的实时共享。而在实现屏幕共享的过程中,我们就不得不来聊一聊抓屏技术。看看唐桥科技音视频PaaS平台是如何根据抓屏技术特性来实现最优的抓屏效率和最佳的用户体验。 Windows系统上有很多抓屏技术,不同的抓屏技术又局限于Windows系统版本,没有一种通用的抓屏技术可以高效的抓取屏幕图像,其中主要的原因是操作系统的显示驱动模型在从XDDM向WDDDM转变,应用层的API也在从GDI.

Es_trella的博客 646

青岛鼎信Java开发面试题及参考答案(3万字长文,多张原理图)

MySQL 的事务特性有哪些? MySQL 事务具有四个重要特性,被称为 ACID 特性。 原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么全部执行,要么全部不执行。例如,在银行转账场景中,从账户 A 转账到账户 B,包括扣减账户 A 的金额和增加账户 B 的金额这两个操作必须作为一个整体来完成。如果在执行过程中发生错误,比如系统崩溃或者数据库出现故障,那么已经执行的部分必须全部回滚,就好像整个转账操作从未发生过一样。 一致性(Consistency):事务必须

大模型大数据攻城狮的专栏 1088

电化学-NanoStat-开源系统的使用说明

本文主要介绍了NanoStat开源系统的使用方法,从硬件打板、设备组装、软件安装3个层次进行了详细说明。整个流程根据作者提供的视频能够很好的完成,不需要太多的技术,对刚入门的新手是一个不错的练手项目。其次软件还有很大的优化空间,能够进一步提高系统的精度,对之后类似恒电位仪系统的开发也有很大的借鉴意义。

分享技术笔记,希望对大家能够有一定的帮助,同时也通过归纳总结提升自己的个人能力。 2001
上一篇: JAVA和.NET使用DES对称加密的区别
下一篇: PBOC规范研究之六、变长记录文件
LuckLiu521
博客等级 码龄21年 6粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值