2023/09/21 14:53:10
如何处理 Windows 7 窗口共享异常?
问题描述
- 在 Windows 7 版本上共享文件资源管理器窗口时,远端用户看到的共享窗口的搜索框颜色可能异常(黑色)。
- 在 Windows 7 版本上共享文件资源管理器窗口时,当本地用户拉长或缩小窗口高度,远端用户看到的共享窗口的搜索框可能显示异常。
问题原因
Windows 7 系统中开启 Aero 主题特效时,窗口具有 WS_EX_LAYERED 属性,RTC SDK 通过 GDI(Graphics Device Interface)DC(Device Context)拷贝方式拿到的窗口图像为黑色。
解决方案
该问题由 Windows 系统的 Aero 主题引起。声网推荐你按照如下步骤关闭该主题以解决问题。
-
开启窗口共享前,判断系统版本。如果系统版本为 Windows 7,加载 DWM(Desktop Window Manager)API:
C++typedef HRESULT(WINAPI* DwmEnableCompositionFunc)(UINT);
typedef HRESULT(WINAPI* DwmIsCompositionEnabledFunc)(BOOL* pfEnabled);
DwmIsCompositionEnabledFunc is_composition_enabled_func_;
DwmEnableCompositionFunc composition_func_;
HMODULE dwmapi_library_ = LoadLibrary(L"dwmapi.dll");
if (dwmapi_library_) {
is_composition_enabled_func_ = reinterpret_cast<DwmIsCompositionEnabledFunc>(
GetProcAddress(dwmapi_library_, "DwmIsCompositionEnabled"));
composition_func_ = reinterpret_cast<DwmEnableCompositionFunc>(
GetProcAddress(dwmapi_library_, "DwmEnableComposition"));
} -
判断 Window 7 系统上是否开启 Aero 主题特效。如果开启,则关闭 Aero 主题特效:
C++BOOL result = FALSE;
if (is_composition_enabled_func_)
is_composition_enabled_func_(&result);
if(result) {
if (composition_func_)
(*composition_func_)(DWM_EC_DISABLECOMPOSITION);
} -
开启窗口共享。
-
结束窗口共享。复原 Window 7 系统上的 Aero 主题特效:
C++if (composition_func_)
(*composition_func_)(DWM_EC_ENABLECOMPOSITION);