本文将告诉大家如何在 X11 里面设置窗口透明
不同于在 WPF 里面可以使用 AllowsTransparency 简单方便的设置透明,在 X11 里面设置窗口透明的方法比较绕。需要获取用于传入给到 XCreateWindow 的 Visual 指针,才能实现窗口透明
感谢 walterlv 大佬提供此方法,我只是代为记录的工具人
以下是一个简单的示例代码,示例代码里面被我忽略掉一些 P/Invoke 调用封装代码,这些被忽略代码可以从本文末尾找到,可以从本文末尾找到整个示例代码的下载方式
先创建一个空的控制台应用,然后编辑 csproj 项目文件,替换为如下代码
以上的 csproj 项目文件代码里和空控制台核心不同在于使用 AllowUnsafeBlocks 开启不安全代码
打开 Program.cs 文件,开始编写 X11 透明窗口示例应用代码
按照 X11 的基础使用方法,先获取 Display 和 Screen 和 RootWindow 对象/指针,代码如下
接着使用 GetVisual 方法获取 visual 指针,代码如下
以上代码的 GetVisual 方法的定义如下
获取 Visual 指针的方法就是本文的核心逻辑了,也是 X11 窗口透明的关键
以上的 GlxInterface 类型定义如下
获取到 visual 指针之后,即可传入到 XCreateWindow 里面,如以下代码
另一个获取 visual 的方法是通过 XMatchVisualInfo 方法获取,如此获取更加简单,不需要借助 OpenGL 模块,代码如下
接下来就是使用 XMapWindow 显示和关联窗口,代码如下
如果运行以上代码,没有看到窗口透明,那可能就是桌面窗口合成管理器没有安装或没有安装正确。还请自行修复一下
比如安装 compiz 窗口合成管理器,安装和运行的命令行如下
比如在 UOS 里,可在系统设置->个性化->通用里,开启窗口特效
如果开启之后依然没有透明窗口背景效果,则请调查一下是否 UOS 里默认的 KWin 窗口合成管理器损坏或被替换为其他的窗口合成管理器,查看当前的窗口合成管理器可使用以下命令
如能输出 compositor: kwin_x11
之类的,则证明依然使用的是 kwin 窗口合成管理器。如输出的字符串里面 compositor 包含的是其他字符串,则请自行了解一下对应的窗口合成管理器是否支持窗口透明或需要进行哪些配置。更多国产 UOS 系统开发相关,欢迎加入 810052083 群交流
完全的 Program.cs 文件的代码如下
以上代码放在 https://github.com/walterlv/Walterlv.BlankUnoApp 仓库里,欢迎大家拉取代码运行。拉取代码之后,打开 BlankUnoApp.sln 文件,即可找到本文的 BlankX11App 示例项目
原文链接: http://blog.lindexi.com/post/dotnet-C-%E8%AE%BE%E7%BD%AE-X11-%E5%BA%94%E7%94%A8%E7%AA%97%E5%8F%A3%E8%83%8C%E6%99%AF%E9%80%8F%E6%98%8E
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 林德熙 (包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我 联系。