首页 > 其他分享 >dotnet X11 设置窗口鼠标触摸命中穿透

dotnet X11 设置窗口鼠标触摸命中穿透

时间:2024-05-21 17:11:11浏览次数:25  
标签:IntPtr 窗口 鼠标 int XShapeCombineRegion 代码 so dotnet X11

本文记录如何在 X11 应用里面,使用 XShapeCombineRegion 方法配置一个 X11 窗口支持和 Win32 窗口一样的命中测试穿透功能,即对应 Win32 的 WS_EX_TRANSPARENT 的鼠标、触摸等的点击等动作的穿透功能,可以实现在窗口中挖空一块范围直接穿透到后面的窗口

在 X11 窗口中,想要实现让窗口不可命中,即所有的鼠标、触摸等的事件穿透到后面的窗口上,可以采用 libXext.so 提供的 XShapeCombineRegion 方法,也可以使用有争议的 libXfixes.so 提供的 XFixesSetWindowShapeRegion 方法

通过以上两个方法即可让 X11 窗口不响应鼠标或触摸的点击输入,让其输入到窗口后面的窗口。适合用来制作一个仅用来展示渲染的窗口,让这个窗口不参与到交互里面

使用比较有争议的 libXfixes.so 提供的 XFixesSetWindowShapeRegion 方法的示例代码如下

// 以下的 childWindowHandle 是一个 X11 窗口

var region = XFixesCreateRegion(display, 0, 0);
XFixesSetWindowShapeRegion(display, childWindowHandle, ShapeInput, 0, 0, region);

    [DllImport("libXfixes.so.3")]
    public static extern IntPtr XFixesCreateRegion(IntPtr display, IntPtr rectangles, int nrectangles);

    [DllImport("libXfixes.so.3")]
    public static extern void XFixesSetWindowShapeRegion(IntPtr display, IntPtr window, int shape_type, int x_offset,
        int y_offset, IntPtr region);

采用 libXext.so 提供的 XShapeCombineRegion 方法的示例代码如下

var region = XCreateRegion();
XShapeCombineRegion(display, childWindowHandle, ShapeInput, 0, 0, region, ShapeSet);

        [DllImport(libX11)]
        public static extern IntPtr XCreateRegion();

        [DllImport("libXext.so.6")]
        public static extern void XShapeCombineRegion(IntPtr display, IntPtr dest, int destKind, int xOff, int yOff, IntPtr region, int op);

我尝试创建两个窗口,其中一个窗口调用了 XShapeCombineRegion 方法,运行程序,将设置了的 XShapeCombineRegion 的窗口激活作为前台窗口,点击此窗口的内容,可以看到点击穿透到后面的窗口

以上两个方法都能实现功能,且通过阅读 X Server的代码,可以发现以上两个方法核心实现基本相同。为了可能的坑点在于 libXfixes.so 可能在某些系统上被砍掉。只是这个 libXfixes.so 也足够旧了,基本上系统都会带的

所有代码放在 githubgitee 上,可以使用如下命令行拉取代码

先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 67cd9188399e7f45bfe83e1af9daf10236b3171c

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 67cd9188399e7f45bfe83e1af9daf10236b3171c

获取代码之后,进入 DikalehebeekaJaqunicobo 文件夹,即可获取到源代码

以上代码经过我在 UOS 系统上测试通过,在 UOS 上的 KWin_X11 能够符合预期工作

如运行代码提示找不到 libXext.so 文件,错误内容如下

System.DllNotFoundException: Unable to load shared library 'libXext.so' or one of its dependencies. In order to help diagnose loading problems, consider using a tool like strace. If you're using glibc, consider setting the LD_DEBUG environment variable:
/home/uos/Downloads/lin/libXext.so: 无法打开共享对象文件: 没有那个文件或目录
/home/uos/Downloads/lin/liblibXext.so: 无法打开共享对象文件: 没有那个文件或目录
/home/uos/Downloads/lin/libXext.so.so: 无法打开共享对象文件: 没有那个文件或目录
/home/uos/Downloads/lin/liblibXext.so.so: 无法打开共享对象文件: 没有那个文件或目录

   at CPF.Linux.XLib.XShapeCombineRegion(IntPtr display, IntPtr dest, Int32 destKind, Int32 xOff, Int32 yOff, IntPtr region, Int32 op)
   at UnoInk.X11Ink.X11InkWindow..ctor(X11Info x11Info, IntPtr mainWindowHandle)
   at UnoInk.X11Ink.X11InkProvider.Start(Window unoWindow)

可以尝试配置使用 libXext.so.6 版本,代码如下

        [DllImport("libXext.so.6")]
        public static extern void XShapeCombineRegion(IntPtr display, IntPtr dest, int destKind, int xOff, int yOff, IntPtr region, int op);

更新之后的代码放在 githubgitee 上,欢迎拉取代码阅读和构建

参考文档:

如何在屏幕上显示一局部透明、鼠标点击可穿过的窗口 - V2EX

2021-08-21窗口管理器杂谈 - 简书

更多 X11 开发请参阅 博客导航

关于在 Windows 系统下的 WPF 窗口点击穿透,请参阅 WPF 制作支持点击穿透的高性能的透明背景异形窗口

标签:IntPtr,窗口,鼠标,int,XShapeCombineRegion,代码,so,dotnet,X11
From: https://www.cnblogs.com/lindexi/p/18204514

相关文章

  • dotnet 命令行工具解决方案 PomeloCli
    目录PomeloCli是什么为什么实现太多的工具太少的规范基于二进制拷贝分发难以为继快速开始1.引用PomeloCli开发命令行应用2.引用PomeloCli开发命令行插件开发命令行插件搭建私有nuget服务发布命令行插件3.使用PomeloCli集成已发布插件安装命令行宿主集成命令行插件卸......
  • 【前端】鼠标捕获元素信息
    functiongetElementXPath(element){if(element.id!==''){return'//*[@id="'+element.id+'"]';}if(element===document.body){return'/html/body';......
  • 判断使用的是 x11 还是 wayland
    date:2024-05-20之前的判断方式是运行命令echo"$XDG_SESSION_TYPE"来查看环境变量的值,如果返回的是wayland则说明用的wayland,如果返回的是x11说明用的x11。但是,如果返回的是tty则不能说明是哪个。例如通过ssh连接到使用x11的远程主机,会返回tty。ps如何判断......
  • 网页布局------鼠标悬停标签切换内容
    页面结构<divclass="body-brick"><divclass="body-brick-title"><h2class="body-brick-title-h2">生活电器</h2><divclass="body-br......
  • delphi cxgrid 画鼠标经过的轨迹或者说是鼠标经过下高亮行
    unitUnit1;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,dxSkinsCore,dxSkinsDefaultPainters,dxSkinscxPCPainter,cxStyles,cxCustomData,cxGraphics,cxFilter,cxData,cxDataStorage,cxEdit,......
  • win11系统 鼠标开机后是好的,但是过一会后响应慢变卡顿怎么回事
    刚开机好的,过一会变卡顿1打开控制面板——电源选项选择【平衡】点击【更改计划设置】2 更改USB设置为【已禁用】即可  3顺便把硬盘也改了,免得掉盘 ......
  • 博客园美化:CSS更改鼠标样式
    话不多说,先上效果图:实现这个效果真的好简单,哎,还搞了好久............
  • 网页布局------鼠标点击标签切换内容
    网页结构<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title&......
  • e语言 鼠标移动发送消息 (大漠版)
    大漠安装注册教程:https://www.bilibili.com/video/BV1mj411Z7PB/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=5fed6e8a7e3ad9f10860bf7a4540ba71......
  • CSS cursor(鼠标样式)
    属性值示意图描述auto 默认值,由浏览器根据当前上下文确定要显示的光标样式default默认光标,不考虑上下文,通常是一个箭头none 不显示光标initial 将此属性设置为其默认值inherit 从父元素基础cursor属性的值context-menu表示上下文菜单可用......