本文记录如何在 X11 应用里面,使用 XShapeCombineRegion 方法配置一个 X11 窗口支持和 Win32 窗口一样的命中测试穿透功能,即对应 Win32 的 WS_EX_TRANSPARENT 的鼠标、触摸等的点击等动作的穿透功能,可以实现在窗口中挖空一块范围直接穿透到后面的窗口
在 X11 窗口中,想要实现让 X11Window 窗口不可命中,即所有的鼠标、触摸等的事件点击穿透到后面的窗口上,可以采用 libXext.so 提供的 XShapeCombineRegion 方法,也可以使用有争议的 libXfixes.so 提供的 XFixesSetWindowShapeRegion 方法
通过以上两个方法即可让 X11 窗口不响应鼠标或触摸的点击输入,让其输入到窗口后面的窗口。适合用来制作一个仅用来展示渲染的窗口,让这个窗口不参与到交互里面
使用比较有争议的 libXfixes.so 提供的 XFixesSetWindowShapeRegion 方法的示例代码如下
采用 libXext.so 提供的 XShapeCombineRegion 方法的示例代码如下
我尝试创建两个窗口,其中一个窗口调用了 XShapeCombineRegion 方法,运行程序,将设置了的 XShapeCombineRegion 的窗口激活作为前台窗口,点击此窗口的内容,可以看到点击穿透到后面的窗口。如此即可使用 C# dotnet 在 X11 应用里实现 Click Through 窗口点击穿透功能
以上两个方法都能实现功能,且通过阅读 X Server的代码,可以发现以上两个方法核心实现基本相同。为了可能的坑点在于 libXfixes.so 可能在某些系统上被砍掉。只是这个 libXfixes.so 也足够旧了,基本上系统都会带的
所有代码放在 github 和 gitee 上,可以使用如下命令行拉取代码
先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码
获取代码之后,进入 DikalehebeekaJaqunicobo 文件夹,即可获取到源代码
以上代码经过我在 UOS 系统上测试通过,在 UOS 上的 KWin_X11 能够符合预期工作
如运行代码提示找不到 libXext.so 文件,错误内容如下
可以尝试配置使用 libXext.so.6 版本,代码如下
更新之后的代码放在 github 和 gitee 上,欢迎拉取代码阅读和构建
以上方法用于设置全应用穿透,在此基础上,支持运行过程中,动态决定穿透范围。比如在某个逻辑里面,设置 (0,0,1000,1000)的范围内支持命中,其他范围依然穿透,可以使用如下代码进行更新
更新之后的代码放在 github 和 gitee 上,可以使用如下命令行拉取代码
先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码
获取代码之后,进入 X11/DikalehebeekaJaqunicobo 文件夹,即可获取到源代码
参考文档:
如何在屏幕上显示一局部透明、鼠标点击可穿过的窗口 - V2EX
2021-08-21窗口管理器杂谈 - 简书
更多 X11 开发请参阅 博客导航
关于在 Windows 系统下的 WPF 窗口点击穿透,请参阅 WPF 制作支持点击穿透的高性能的透明背景异形窗口
原文链接: http://blog.lindexi.com/post/dotnet-X11-%E8%AE%BE%E7%BD%AE%E7%AA%97%E5%8F%A3%E9%BC%A0%E6%A0%87%E8%A7%A6%E6%91%B8%E5%91%BD%E4%B8%AD%E7%A9%BF%E9%80%8F
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 林德熙 (包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我 联系。