如何处理 Windows 7 窗口共享异常?
产品 / 插件:实时音视频 / 实时语音 / 低延迟直播 / 超低延迟直播
平台 / 框架:Windows
更新时间:2021-09-09 19:57
问题描述
在 Windows 7 版本上共享文件资源管理器窗口时,远端用户看到的共享窗口的搜索框颜色可能异常(黑色)。
在 Windows 7 版本上共享谷歌浏览器窗口时,远端用户可能完全看不到共享窗口。
在 Windows 7 以上版本(Windows 8、Windows 8.1、Windows 10)上,开启屏幕 DPI(Dots Per Inch,每英寸点数)缩放或者共享时修改屏幕分辨率,远端用户看到的共享窗口不完整或者有黑边。
问题原因
Windows 的窗口类型多,简单的通过 GDI(Graphics Device Interface,图形设备接口)方式拷贝窗口位图无法满足各种场景下的共享窗口的要求。
解决方案
ZegoScreenCapture-Windows SDK 通过组合各种采集方式来满足大部分场景,在窗口采集时提供了多种模式选择。
enum ZegoScreenCaptureWindowMode
{
kZegoScreenCaptureWindowModeWindow = 1, ///< 截取窗口整体画面
kZegoScreenCaptureWindowModeClient = 2, ///< 截取窗口客户区
kZegoScreenCaptureWindowModeRgn1 = 3, ///< 截取窗口对应屏幕区域 (窗口被覆盖后继续捕获对应区域)
kZegoScreenCaptureWindowModeRgn2 = 4, ///< 截取窗口对应屏幕区域 (窗口被覆盖后继续捕获,覆盖区域涂黑)
kZegoScreenCaptureWindowModeRgn3 = 5, ///< 截取窗口对应屏幕区域 (窗口被覆盖后继续捕获,过滤上层覆盖的窗口,win8 及以后系统生效)
};
/// \brief 在采集目标为单个窗口的模式下,设置目标采集模式,比如是全部窗口内容还是窗口客户区内容(macOS没有实现)
/// \param mode 窗口采集模式,默认采集整个窗口
/// \return 设置成功返回非0值,否则返回0
/// \note 在zego_screencapture_set_target_window后调用本接口进行设置,kZegoScreenCaptureWindowModelClient仅支持有限窗口
/// \see zego_screencapture_set_target_window
/// \see ZegoScreenCaptureWindowMode
SCREENCAPTURE_API int zego_screencapture_set_target_window_mode(enum ZegoScreenCaptureWindowMode mode);
各模式差别
“kZegoScreenCaptureWindowModeWindow” 和 “kZegoScreenCaptureWindowModeClient” 模式是通过 GDI 采集窗口的位图。
“kZegoScreenCaptureWindowModeRgn1”、“kZegoScreenCaptureWindowModeRgn2” 和 “kZegoScreenCaptureWindowModeRgn3” 模式是通过 GDI 采集窗口在屏幕中的位图,相当于采集屏幕位图,然后把窗口图像提取出来。三者的区别是在共享窗口被覆盖时的处理方式不同:
- kZegoScreenCaptureWindowModeRgn1:窗口被覆盖后继续捕获对应区域。
- kZegoScreenCaptureWindowModeRgn2:窗口被覆盖后继续捕获,覆盖区域涂黑。
- kZegoScreenCaptureWindowModeRgn3:窗口被覆盖后继续捕获,过滤上层覆盖的窗口,win8 及以上版本系统生效。
场景推荐
用户在共享窗口时主要有如下两种场景:
- 场景一
固定采集某个窗口,例如需要指定共享某个 APP 窗口时,优先使用 “kZegoScreenCaptureWindowModeWindow” 模式。当共享窗口出现 “问题描述” 中的现象时,则可以根据产品需求切换到其他模式进行尝试。
zego_screencapture_set_target_window_mode(kZegoScreenCaptureWindowModeWindow);
- 场景二
采集的窗口不确定,或者运行的系统版本也不确定,建议使用 “kZegoScreenCaptureWindowModeRgn3” 模式。此模式由于是相当于采集的屏幕的图像,所以跟被采集窗口的特性无关,能兼容所有类型的窗口。在处理窗口被覆盖或者移出屏幕外面的场景时,也可以根据需求选择 “kZegoScreenCaptureWindowModeRgn1” 或 “kZegoScreenCaptureWindowModeRgn2” 模式。
zego_screencapture_set_target_window_mode(kZegoScreenCaptureWindowModeClient);