本文将告诉大家如何在 Gtk3 的 Gtk.Window 或 Gdk.Window 里面获取到对应的 X11 窗口 XID 号
记录本文是因为我在这里踩了很多坑,核心问题就是 GTK 有很多个版本,我开始找的全是使用 GTK 2 的 gdk_x11_drawable_get_xid
方法,而不是 GtkSharp 3.24 对应的 GTK 3 的方法
以上的 gdk_x11_drawable_get_xid 方法需要构建传入 GdkDrawable 指针,让我弄错为使用 gtk_widget_get_window
方法去获取其 gdk 窗口,于是错误就更加诡异
通过阅读文档发现了以下的 gtk 架构图,即 gtk 的窗口和 gdk 窗口是不相同的,可以通过 gtk_widget_get_window
方法获取,在 C# dotnet 里面可直接使用 Gtk.Window 的 Window 属性,更多请参阅:https://en.wikipedia.org/wiki/GDK
从 Gtk 的 Window 窗口获取 Gdk 的 Window 窗口,可使用以下简单代码获取
获取 Gdk 窗口指针,可通过 Handle 属性获取,如以下代码
以上获取的 handle 指针与 var windowHandle = gtk_widget_get_window(gtkWindow.Handle);
获取的 windowHandle
是相同的,因为在 GtkSharp 的 Widget.cs 就是如此实现的
使用 gdk_x11_window_get_xid 方法即可正确的从 gdk 窗口获取到对应的 X11 窗口的 XID 值
为了方便使用 gdk_x11_window_get_xid 方法,以下照 GtkSharp 进行一些代码定义
接着在窗口的 Show 方法之后,即可获取到对应的 X11 窗口
通过以上代码输出的 X11 窗口的 XID 号,可以同步在命令行输入进 xwininfo 命令里面。比如我这里输出的是 X11 窗口 0x5600003
的值
打开另一个命令行,输入以下命令,将 XID 传入 xwininfo 命令,即可看到显示的窗口标题和当前运行的窗口是相同的
我核心踩坑就是搜到的是 GTK 2 的使用方法,以及将 gtk 的窗口当成 gdk 的窗口传入方法
本文代码放在 github 和 gitee 上,可以使用如下命令行拉取代码
先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码
获取代码之后,进入 LejarkeebemCowakiwhanar 文件夹,即可获取到源代码
更多 GTK 开发请参阅 博客导航
原文链接: http://blog.lindexi.com/post/dotnet-%E5%A6%82%E4%BD%95%E4%BB%8E-Gtk-3-%E7%9A%84%E7%AA%97%E5%8F%A3%E5%88%B0%E5%AF%B9%E5%BA%94%E7%9A%84-X11-%E7%AA%97%E5%8F%A3
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 林德熙 (包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我 联系。