LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

WPF调用Win32的SetWindowDisplayAffinity 函数 实现捕获屏幕时,过滤指定的窗口

freeflydom
2025年12月5日 9:55 本文热度 206

一、背景

最近在开发互动传屏的需求,使用了WGC捕获桌面屏幕的方式,实现屏幕的捕获和录制。在验收阶段,产品的验收的建议是:需要过滤自身的窗口,跟腾讯会议一样,进行互动传屏。

1、腾讯会议共享屏幕的窗口如下图

腾讯会议的发起者的主窗口在其他设备端,是看不到的,直接透明下去。还有会议的录屏的全屏四个边角的绿框也是看不到的

 

2、我们自己开发的屏幕捕获的效果如下图:

窗口在捕获之后,都是层层传递下去,类似直播的效果一样。

 二、介绍SetWindowDisplayAffinity 函数 

其实微软的Win32 API 有函数 实现:SetWindowDisplayAffinity 函数 (winuser.h) - Win32 apps | Microsoft Learn,支持 Windows 7 中新增的窗口内容保护功能。

此功能使应用程序能够保护自己的屏幕窗口内容,使其免受通过一组特定的公共操作系统功能和 API 捕获或复制

SetWindowDisplayAffinity 函数 (winuser.h)

指定窗口内容的显示位置。

语法

C++
BOOL SetWindowDisplayAffinity(
  [in] HWND  hWnd,
  [in] DWORD dwAffinity
);

参数

[in] hWnd

类型:HWND

顶级窗口的句柄。 窗口必须属于当前进程。

[in] dwAffinity

类型:DWORD

指定窗口内容的显示位置的显示相关性设置。

此参数的取值可为下列值之一:

 
含义
WDA_NONE
0x00000000
对窗口的显示位置没有限制。
WDA_MONITOR
0x00000001
窗口内容仅显示在监视器上。 在其他任何位置,窗口都会显示,其中不显示任何内容。
WDA_EXCLUDEFROMCAPTURE
0x00000011
窗口仅显示在监视器上。 在其他任何位置,窗口根本不显示。

此相关性的一个用途是用于显示视频录制控件的窗口,以便控件不包括在捕获中。

Windows 10版本 2004 中引入。 请参阅有关以前版本的 Windows 兼容性的备注。

返回值

类型: BOOL

如果函数成功,则返回 TRUE;例如,在非顶级窗口上进行函数调用时,它将返回 FALSE 。 要获得更多的错误信息,请调用 GetLastError。

注解

此函数和 GetWindowDisplayAffinity 旨在支持 Windows 7 中新增的窗口内容保护功能。 此功能使应用程序能够保护自己的屏幕窗口内容,使其免受通过一组特定的公共操作系统功能和 API 捕获或复制。 但是,仅当桌面窗口管理器 (DWM) 组合桌面时,它才有效。

请务必注意,与安全功能或数字版权管理 (DRM) 实现不同,无法保证使用 SetWindowDisplayAffinity 和 GetWindowDisplayAffinity 以及其他必要功能(如 DwmIsCompositionEnabled)将严格保护窗口内容,例如有人拍摄屏幕照片。

从 Windows 10 版本 2004 开始,WDA_EXCLUDEFROMCAPTURE 是受支持的值。 在以前版本的 Windows 上将显示相关性设置为WDA_EXCLUDEFROMCAPTURE的行为就像应用了WDA_MONITOR一样。

要求

 
要求
最低受支持的客户端Windows 7 [仅限桌面应用]
最低受支持的服务器Windows Server 2008 R2 [仅限桌面应用]
目标平台Windows
标头winuser.h (包括 Windows.h)
LibraryUser32.lib
DLLUser32.dll
API 集在 Windows 8.1) 中引入的 ext-ms-win-ntuser-window-l1-1-1 (

另请参阅

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 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved