1. 为什么需要无边框透明窗口?
在开发桌面应用时,我们经常会遇到一些特殊需求。比如你想做一个桌面悬浮时钟、系统监控面板或者游戏辅助界面,这时候传统的窗口边框就显得多余了。更理想的情况是:窗口完全透明,只显示你需要的内容,而且鼠标点击还能穿透到后面的窗口。
我在开发一个桌面歌词显示工具时就遇到了这个问题。传统方案要么有难看的边框,要么会挡住后面的窗口操作。后来发现通过调用Windows API可以完美解决,这就是我们今天要讲的技术。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 准备工作与环境配置
2.1 Unity项目基础设置
在开始写代码之前,有几个关键设置必须完成。我刚开始做这个功能时,就因为漏掉了一个设置调试了半天。
首先打开Player Settings:
- 取消勾选"Fullscreen Mode"(全屏模式)
- 勾选"Run In Background"(在后台运行)
- 在Graphics API设置中,确保取消勾选D3D11(这个很重要!)
然后设置主摄像机:
csharp复制Camera.main.backgroundColor = new Color(0, 0, 0, 0);
这个设置让摄像机的背景完全透明。记得检查场景中不能有其他会遮挡的UI元素。
2.2 理解Windows API的基本概念
我们要用到的几个关键API都来自user32.dll和Dwmapi.dll。简单来说:
- user32.dll:处理窗口创建、管理和消息
- Dwmapi.dll:处理桌面窗口管理器相关功能
在C#中调用这些原生API需要使用P/Invoke(平台调用)技术。这就像是在C#和原生代码之间架了一座桥。
3. 核心API详解与实现
3.1 获取窗口句柄
每个Windows窗口都有一个唯一的句柄(HWND),就像身份证号一样。我们需要先获取当前Unity窗口的句柄:
csharp复制[DllImport("user32.dll")]
private static extern IntPtr GetActiveWindow();
private IntPtr hWnd;
void Start() {
hWnd = GetActiveWindow();
// 其他初始化代码...
}
