WPF调用Win32的SetWindowDisplayAffinity 函数 实现捕获屏幕时,过滤指定的窗口
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
一、背景最近在开发互动传屏的需求,使用了WGC捕获桌面屏幕的方式,实现屏幕的捕获和录制。在验收阶段,产品的验收的建议是:需要过滤自身的窗口,跟腾讯会议一样,进行互动传屏。 1、腾讯会议共享屏幕的窗口如下图 腾讯会议的发起者的主窗口在其他设备端,是看不到的,直接透明下去。还有会议的录屏的全屏四个边角的绿框也是看不到的
2、我们自己开发的屏幕捕获的效果如下图: 窗口在捕获之后,都是层层传递下去,类似直播的效果一样。
二、介绍SetWindowDisplayAffinity 函数其实微软的Win32 API 有函数 实现:SetWindowDisplayAffinity 函数 (winuser.h) - Win32 apps | Microsoft Learn,支持 Windows 7 中新增的窗口内容保护功能。 此功能使应用程序能够保护自己的屏幕窗口内容,使其免受通过一组特定的公共操作系统功能和 API 捕获或复制 SetWindowDisplayAffinity 函数 (winuser.h)指定窗口内容的显示位置。 语法C++ 参数
类型:HWND 顶级窗口的句柄。 窗口必须属于当前进程。
类型:DWORD 指定窗口内容的显示位置的显示相关性设置。 此参数的取值可为下列值之一: 返回值类型: BOOL 如果函数成功,则返回 TRUE;例如,在非顶级窗口上进行函数调用时,它将返回 FALSE 。 要获得更多的错误信息,请调用 GetLastError。 注解此函数和 GetWindowDisplayAffinity 旨在支持 Windows 7 中新增的窗口内容保护功能。 此功能使应用程序能够保护自己的屏幕窗口内容,使其免受通过一组特定的公共操作系统功能和 API 捕获或复制。 但是,仅当桌面窗口管理器 (DWM) 组合桌面时,它才有效。 请务必注意,与安全功能或数字版权管理 (DRM) 实现不同,无法保证使用 SetWindowDisplayAffinity 和 GetWindowDisplayAffinity 以及其他必要功能(如 DwmIsCompositionEnabled)将严格保护窗口内容,例如有人拍摄屏幕照片。 从 Windows 10 版本 2004 开始,WDA_EXCLUDEFROMCAPTURE 是受支持的值。 在以前版本的 Windows 上将显示相关性设置为WDA_EXCLUDEFROMCAPTURE的行为就像应用了WDA_MONITOR一样。 要求
另请参阅SetWindowDisplayAffinity, Windows 三、使用SetWindowDisplayAffinity 函数1、定义 SetWindowDisplayAffinity 函数 private const uint WDA_NONE = 0x00000000; private const uint WDA_MONITOR = 0x00000001; private const uint WDA_EXCLUDEFROMCAPTURE = 0x00000011; [DllImport("user32.dll")] public static extern uint SetWindowDisplayAffinity(IntPtr hWnd, uint dwAffinity); 2、在MainWindows 的 SourceInitialized 事件调用(只要能获取得到窗口的句柄即可),由于我的需求是在捕获屏幕的时候,不需要显示,所以我这边调用的是:WDA_EXCLUDEFROMCAPTURE(0x00000011) public MainWindow() { InitializeComponent(); SourceInitialized += MainWindow_SourceInitialized; } private IntPtr currentWindowHandle; private void MainWindow_SourceInitialized(object sender, EventArgs e) { currentWindowHandle = new WindowInteropHelper(this).Handle; var result = SetWindowDisplayAffinity(currentWindowHandle, WDA_EXCLUDEFROMCAPTURE); } private const uint WDA_NONE = 0x00000000; private const uint WDA_MONITOR = 0x00000001; private const uint WDA_EXCLUDEFROMCAPTURE = 0x00000011; [DllImport("user32.dll")] public static extern uint SetWindowDisplayAffinity(IntPtr hWnd, uint dwAffinity); 3、调用的效果如下: 捕获的窗口已经没有显示主窗口了
转自https://www.cnblogs.com/wuty/p/19306036 该文章在 2025/12/5 9:55:44 编辑过 |
关键字查询
相关文章
正在查询... |