#define WDA_NONE 0x00000000
#define WDA_MONITOR 0x00000001
#define WDA_EXCLUDEFROMCAPTURE 0x00000011
c#调用示例
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
//using Windows.UI.ViewManagement;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// 导入函数定义
[DllImport("user32.dll")]
private static extern uint SetWindowDisplayAffinity(IntPtr hwnd, uint dwAffinity);
private void button1_Click(object sender, EventArgs e)
{
// 获取窗口句柄
IntPtr hwnd = this.Handle;
uint WDA_EXCLUDEFROMCAPTURE = 0x00000011; //透明
//uint WDA_MONITOR = 0x00000001; //显示为黑色
// 设置窗口的透明属性
SetWindowDisplayAffinity(hwnd, WDA_EXCLUDEFROMCAPTURE);
timer1.Enabled = true;
}
private void button2_Click(object sender, EventArgs e)
{
}
private void timer1_Tick(object sender, EventArgs e)
{
timer1.Enabled = false;
// 获取窗口句柄
IntPtr hwnd = this.Handle;
uint WDA_NONE = 0x00000000;
// 设置窗口不透明
SetWindowDisplayAffinity(hwnd, WDA_NONE);
}
}
}
函数的说明参考下面网页
SetWindowDisplayAffinity 函数 (winuser.h) - Win32 apps | Microsoft Learnhttps://learn.microsoft.com/zh-CN/windows/win32/api/winuser/nf-winuser-setwindowdisplayaffinity
其中 winuser.h 定义了其中的第二个参数值
winuser.h中关于此函数的参数记录如下
#define WDA_NONE 0x00000000
#define WDA_MONITOR 0x00000001
#define WDA_EXCLUDEFROMCAPTURE 0x00000011
此函数和 GetWindowDisplayAffinity 旨在支持 Windows 7 中新增的窗口内容保护功能。 此功能使应用程序能够保护自己的屏幕窗口内容,防止通过一组特定的公共操作系统功能和 API 捕获或复制。 但是,仅当桌面窗口管理器 (DWM) 撰写桌面时,它才有效。
请务必注意,与安全功能或数字版权管理 (DRM) 实现不同,不能保证使用 SetWindowDisplayAffinity 和 GetWindowDisplayAffinity 以及其他必要功能(如 DwmIsCompositionEnabled)将严格保护窗口化内容,例如有人拍摄屏幕照片。
从 Windows 10 版本 2004 开始,WDA_EXCLUDEFROMCAPTURE 是受支持的值。 在以前版本的 Windows 上将显示关联设置为WDA_EXCLUDEFROMCAPTURE的行为就像应用了WDA_MONITOR一样。
特此记录
anlog
2023年9月9日