2023年5月18日16:30:56
第一次接触windows窗体,学习dx之路。
------------------------------------------------
能实现屏幕共享的技术有很多,
-
Windows GDI:这是 Windows 系统上兼容性最好的一套方案,从 Windows 2000 开始就有,现在还在继续提供服务,效率也还不错,部分接口底层支持了硬件加速功能,至于缺点我们后面叙述。
-
Microsoft DirectX Graphics Infrastructure(DXGI):这套 API 是为了封装不同版本 DirectX 部分接口而出现的,首次出现是在 Direct 3D 10,现在还在更新。本文关注的是 DirectX 提供的显示器数据抓取技术。
-
DWM:这项技术是微软在 Vista 上,为了提高桌面窗口显示效果而提供的一套 API,其基本思路是:改变过去直接绘制窗口到屏幕的做法,在视频内存中开辟一块离屏渲染区域,用来做各种像素处理,之后再交给屏幕显示,以此实现 Vista 有的毛玻璃效果,以及按下窗口键 +Tab 键来做桌面窗口切换时的 3D 转化效果等。通过这套 API 我们可以实现窗口缩略图的渲染,在 Windows 7 上,DWM 可以通过切换系统主题来控制其打开和关闭,即 Aero 主题。从 Windows 8 开始,系统默认都是打开 DWM 。这套 API 一般可以用来获取目标窗口的缩略图(thumbnail,支持动态更新),用来分享画面的话,分辨率偏低,不太能满足需求。
-
Magnification API:我们姑且称之为“放大镜 API”,这个是 Windows 上预装的放大镜程序底层使用的技术,我们正好可以利用这个技术,同时还可以实现窗口过滤功能。这套 API 也是目前兼容范围较广,各类 App 使用最多的窗口显示数据抓取技术,我们后面会详细分析。
-
Windows Grapics Capture(WGC API):微软最新提供的一套正式用来抓取屏幕数据的接口,遗憾的是最初是给 UWP 提供的,而非 Win32 App,且要求必须是 Windows 10, Update (1809) 及之后的系统才支持,但是官方提供的,我们也要予以足够的重视。
-
Windows Media API,以及各种 hook 技术 …… 可用范围较窄,因此这里不讨论。
针对于项目需要,最后选择了DXGI来实现屏幕共享。参考的是