SetWindowDisplayAffinity 函数设置窗体透明

#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 Learnicon-default.png?t=N7T8https://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日

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在Unity3D中实现窗体透明,可以按照以下步骤进行操作: 首先,确保你正在使用Unity3D的最新版本。然后,创建一个新的项目或打开现有的项目。 在Unity编辑器中,点击"Window"(窗口)选项卡,然后选择"Package Manager"(包管理器)。在包管理器中,确保你已经安装了"Universal Windows Platform"(通用Windows平台)模块。 接下来,点击"Window"(窗口)选项卡,然后选择"Project Settings"(项目设置)。在项目设置窗口中,选择"Player"(玩家)选项卡,然后点击"XR Settings"(XR设置)下拉菜单。 在XR设置下拉菜单中,选择"Player"(玩家)选项卡,并将"Virtual Reality Supported"(支持虚拟现实)选项设置为关闭。 然后,在"Player"(玩家)选项卡中,点击"Resolution and Presentation"(分辨率和演示)部分的"Run In Background"(在后台运行)复选框,以允许Unity应用在失去焦点时继续运行。 现在,你可以编写自己的代码来实现窗体透明。例如,你可以在脚本中使用"Color"(颜色)类型来设置窗体的背景色,并将Alpha通道值设置为0,以实现全透明效果。 请注意,实现窗体透明可能只在Windows平台有效。在其他平台上,窗体透明可能会有不同的实现方法。 希望这些步骤可以帮助你在Unity3D中实现窗体透明。祝你好运! ### 回答2: 要在Unity3D中实现窗体透明,可以按照以下步骤进行操作: 首先,在Unity3D中创建一个新项目或者打开现有项目。 然后,在Hierarchy视图中创建一个新的空对象(GameObject)。 接下来,在Inspector视图中将空对象的名称设置为"TransparentWindow"。 然后,为了将Unity项目转换为窗体应用程序,需要使用Unity的Build Settings功能。打开菜单栏中的File,选择Build Settings选项。 在Build Settings窗口中,选择目标平台为Windows(或者根据需要选择其他平台)。 点击Player Settings,在Player窗口的Resolution and Presentation选项中,取消勾选Default Is Full Screen。 然后,在Resolution and Presentation选项中取消勾选Run in Background和Fullscreen Window等选项。 接下来,在Player窗口的Other Settings选项卡中,选择Allow Title Bar to Display和Custom Title Bar Style等选项。 然后,在Unity项目的Assets文件夹中创建一个新的C#脚本。 在脚本中,使用System.Runtime.InteropServices命名空间中的[DllImport]特性导入Windows API函数。例如: [DllImport("user32.dll")] public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); 设置窗体参数函数如下: const int GWL_STYLE = -16; const int WS_POPUP = 0x80000000; const int WS_VISIBLE = 0x10000000; 然后,在脚本的Start函数中,获取Unity Player的窗体句柄并调用SetWindowLong函数设置窗体样式,使其透明: IntPtr hwnd = GetActiveWindow(); SetWindowLong(hwnd, GWL_STYLE, WS_POPUP | WS_VISIBLE); 最后,将该脚本附加到在Hierarchy视图中创建的"TransparentWindow"对象上。 保存并运行Unity项目,将生成的可执行文件(.exe)作为窗体应用程序打开,应该能够看到透明窗体。 这些步骤将帮助你在Unity3D中实现窗体透明。记得在操作之前备份项目文件,以防发生意外。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值