Skip to content

dotnet 在 UNO 里获取 X11 窗口指针的方法

Updated: at 12:16,Created: at 23:25

在 UNO 的 5.2 版本,可以使用 X11 平台承载 UNO 应用。此时我需要获取到 UNO 应用的窗口的 X11 窗口指针,如此即可调用 X11 平台相关逻辑对 UNO 窗口执行一些交互

本文以下的方法需要用到反射,已在 5.2.161 及附近版本测试通过

通过阅读 UNO 的源代码,可以看到 Window 类型里面放入了不公开的 NativeWindow 属性,这个属性是平台相关的。在 X11 平台下是 Uno.WinUI.Runtime.Skia.X11.X11Window 类型。对应的 X11Window 类型的定义如下

internal record struct X11Window(IntPtr Display, IntPtr Window, (int stencilBits, int sampleCount, IntPtr context)? glXInfo)
{
public X11Window(IntPtr Display, IntPtr Window) : this(Display, Window, null)
{
}
public readonly void Deconstruct(out IntPtr Display, out IntPtr Window, out (int stencilBits, int sampleCount, IntPtr context)? GLXInfo)
{
Display = this.Display;
Window = this.Window;
GLXInfo = this.glXInfo;
}
}

获取 X11Window 里面的 Window 属性即可获取到 X11 窗口指针

反射的代码如下

Uno.WinUI.Runtime.Skia.X11.X11Window
var type = MainWindow.GetType();
var nativeWindowPropertyInfo = type.GetProperty("NativeWindow", BindingFlags.Instance | BindingFlags.NonPublic);
var x11Window = nativeWindowPropertyInfo!.GetMethod!.Invoke(MainWindow, null)!;
var x11WindowType = x11Window.GetType();
var x11WindowIntPtr = (IntPtr) x11WindowType.GetProperty("Window", BindingFlags.Instance | BindingFlags.Public)!.GetMethod!.Invoke(x11Window, null)!;
Console.WriteLine($"Uno 窗口句柄 {x11WindowIntPtr}");

通过以上方式即可获取到 X11 窗口指针

但是必须说明的是,使用反射获取,也许在后续版本将会失效。我已经和 UNO 团队提需求了,请看 https://github.com/unoplatform/uno/issues/17194

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

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

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 0f1d39d4f2bde2e60d790cb14302b5397ca0ae9c

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

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 0f1d39d4f2bde2e60d790cb14302b5397ca0ae9c

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


知识共享许可协议

原文链接: http://blog.lindexi.com/post/dotnet-%E5%9C%A8-UNO-%E9%87%8C%E8%8E%B7%E5%8F%96-X11-%E7%AA%97%E5%8F%A3%E6%8C%87%E9%92%88%E7%9A%84%E6%96%B9%E6%B3%95

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。 欢迎转载、使用、重新发布,但务必保留文章署名 林德熙 (包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我 联系