`
luckliu521
  • 浏览: 258758 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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的不断发展和进步, 对开发人员究竟是喜是悲?
分享到:
评论

相关推荐

    远程控制抓屏与传输速度极快

    在IT行业中,远程控制技术是一种常见的工具,它允许用户通过网络对远程计算机进行操作和管理。"远程控制抓屏与传输速度极快"这个标题暗示了我们正在讨论一个高效的远程控制解决方案,它不仅能够快速捕获远程桌面的...

    C# 截屏源代码.rar

    在IT领域,编程语言C#以其高效、稳定和丰富的库支持深受开发者喜爱,尤其是在Windows桌面应用开发中。本文将深入探讨“C# 截屏源代码”,帮助你理解和掌握如何在C#环境下实现屏幕截图功能。 一、C#基础与.NET ...

    截屏操作动态dll bcb

    在IT行业中,截屏操作是一项常见的功能,尤其在开发网页应用、桌面软件或者浏览器扩展时。本主题聚焦于一个特定的动态链接库(DLL),它是由C++Builder 2010编译创建的,主要服务于所有类型的浏览器,提供截屏功能。...

    VC截屏和UDP传输

    综上所述,“VC截屏和UDP传输”涉及到屏幕捕获、图像压缩、网络通信等多个领域的技术,是实现远程协作、在线教育、远程桌面等应用场景的关键技术之一。通过理解和掌握这些知识点,我们可以开发出高效、稳定且实用的...

    深信服aDesk独享桌面视频重定向和外设映射.pdf

    这项技术支持Windows Media Player和暴风影音5等常见播放器,但对视频编码格式、封装格式和码率、帧率有一定要求。例如,720p分辨率的视频需要4Mbps的带宽,而1080p则需要15Mbps。需要注意的是,此功能不支持USB存储...

    大白鲨远控1.5共享版

    6. **屏幕截图和录像**:为了监控或回溯操作,软件可能提供定期截屏或录制远程桌面的功能。 7. **性能优化**:对于远程控制,延迟和画质是关键。大白鲨远控1.5可能会有专门的算法优化,以减少延迟并保持高清的视频...

    Delphi仿QQ屏幕截屏程序

    在Delphi中,实现屏幕截图涉及的关键技术包括Windows API函数和GDI(Graphics Device Interface)。Windows API提供了诸如GetDesktopWindow()、GetWindowDC()和BitBlt()等函数,用于获取桌面窗口句柄、设备上下文...

    windows电脑快捷键大全

    在Windows操作系统中,快捷键是提高工作效率的重要工具。它们允许用户快速执行常见任务,而无需通过鼠标或触摸屏。以下是一份详尽的Windows电脑快捷键大全,涵盖了从基本操作到高级功能的各种快捷键,适用于各种...

    2023年电大计算机网考考点版考试必备计算机应用基础题库.doc

    Windows操作系统是个人计算机中最常见的操作系统之一,它提供了丰富的用户界面和强大的功能。 1. **任务栏**:任务栏通常位于屏幕底部,显示了当前运行的程序、打开的窗口以及系统托盘区域。选项C正确描述了任务栏...

    C# 屏幕广播工程

    在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows桌面应用和游戏时。"C#屏幕广播工程"是一个项目,它展示了如何利用C#实现局域网内的屏幕共享功能。下面将详细阐述这个项目涉及到的核心技术点。 首先,...

    Wallpaper.zip

    在Windows操作系统中,用户可以通过内置的“压缩文件夹”功能创建和解压.zip文件,而在MacOS中,可以使用“归档实用程序”。此外,还有许多第三方工具,如WinRAR和7-Zip,提供了更高级的功能,如密码保护和更高级别...

    局域网监控源程序.rar

    在IT领域,局域网(LAN)监控是一种技术,用于管理员或家长监控网络中的设备活动,以确保数据安全、防止非法访问以及提升工作效率。本文将深入探讨“局域网监控源程序”的相关知识点,包括其原理、实现方式、常用...

    远程控制抓图

    远程控制通常包括桌面共享、键盘鼠标同步、文件传输等功能。 2. **系统启停控制**:远程控制不仅限于查看和操作,还能执行更高级的任务,如远程启动或关闭计算机。这需要操作系统支持相应的API或服务,例如Windows...

    专升本-计算机文化基础真题及答案.doc

    8. 剪贴板操作:Ctrl+PrintScreen键组合可以将整个桌面的内容复制到剪贴板,用于截屏。 9. 脚注与页脚:在Word中,脚注是对文档中特定内容的注释,通常出现在页面底部;页脚则用于添加页码、日期等信息。 10. 打印...

    【重传】vc实现虚拟摄像头2例

    这涉及到了Windows API中的截屏函数,以及DirectShow的视频捕获机制。 3. **发送AVI视频**: 第二个案例"VirtualCamera_Video"则是将预先录制的AVI视频文件作为虚拟摄像头的输出。这需要解析AVI文件的结构,读取其...

    计算机应用基础答案.pdf

    9. **Windows截屏操作**:Print Screen键用于截取整个屏幕,Alt + Print Screen键用于截取当前活动窗口。 10. **快捷方式创建**:可以通过右键点击文件选择“发送到桌面快捷方式”,或者拖拽文件至桌面并选择创建...

    计算机应用基础答案(2).doc

    九、Windows截屏 1. Print Screen键:截取整个屏幕。 2. Alt + Print Screen键:截取当前活动窗口。 十、快捷方式创建 1. 右键点击文件,选择“发送到”->“桌面(创建快捷方式)”。 2. 直接将文件拖动到桌面,...

    C#编程经验技巧宝典

    8 <br>0018 有效利用Visual Studio 2005附带程序 8 <br>0019 有效使用MSDN帮助 9 <br>0020 如何设置MSDN帮助 9 <br>1.4 其他 10 <br>0021 如何添加项目引用 10 <br>0022 如何添加Web...

Global site tag (gtag.js) - Google Analytics