-2

我想做一个函数,可以通过它的 PID 在 C++ 中移动 Linux 中的窗口。所以我在Windows下试过了。但是我很难为 Linux 编译它。有没有办法用 Qt 做到这一点?由于我还没有找到,所以我尝试为 Linux 编译。

我正在使用 MoveWindow 函数,它是 Windows API 的一部分。是否有任何 Linux 等价物?

4

1 回答 1

3

如果您不想这样做,则不必手动执行此操作,因为那里已经有很多工具可以执行诸如移动、调整大小、最大化和任何窗口之类的任务。

您可能想要仔细研究的一个工具的名称是wmctrl即使您不打算使用,也可以通过查看源代码找到一些有趣的技巧。

移动只有创建窗口的客户端的 pid 知道的窗口的任务可能不是最简单的任务,原因有几个。

  • 首先,您真的不应该尝试这样做,因为在 X Windows 哲学中,窗口管理器的工作是在屏幕上排列窗口。

    以及 ICCCM(参见:http ://de.wikipedia.org/wiki/Inter-Client_Communication_Conventions_Manual )作为 EWM 规范(参见:http ://standards.freedesktop.org/wm-spec/wm-spec-latest.html ) 强烈劝阻任何客户尝试自行移动调整大小或其他任何内容。最有可能移动由另一个客户“拥有”的窗口可能被认为是更大的邪恶。

  • 您可能面临的第二个问题是,X 11 协议没有任何 pid 概念。

    由于它被设计为通过网络使用,因此您永远无法真正确定该程序与您当前坐在同一台机器上运行。因此,像 pid 这样的东西没有多大意义,因为如果它们在不同的机器上运行,可能会有任意数量的具有相同 pid 的客户端在同一个 X 服务器上显示窗口。

幸运的是,它并没有那么糟糕,因为 EWMH 规范鼓励任何客户端在其顶级窗口上设置_NET_WM_PID属性,即创建窗口的客户端的 pid。

再次遵守 EWMH 规范并不是由 X 服务器以任何方式强制执行的,因此尽管几乎所有客户端都会设置它,但仍然不能保证您会找到属于特定 pid 的窗口。

可能性

虽然直到这里提到的所有要点似乎都相当有限,但实际上很可能恰恰相反。即使实际上完全弄乱在 X 会话中运行的任何其他客户端相对容易,所以引入了关于如何在 X 词中成为好公民的整套规则。

由于 X11 协议本身是一种网络协议(并不是 100% 正确,因为本地运行的客户端很可能会通过 UNIX 域套接字与 X 服务器进行通信),因此不需要任何特定的库来与 X 服务器通信。

谈到您的问题中提到的 C,Xlib长期以来一直是广泛使用的唯一一种实现,但还有另一种称为xcb的绑定。与 Xlib 相比,API 略有变化。

说起Xlib 直到现在我还没有使用过任何xcb,所以我不能告诉你太多关于它可能是以下可能有用的方法。

  • XOpenDisplay - 打开到 X 服务器的连接
  • XQueryTree - 获取服务器上当前活动的窗口树
  • XInternAtom - 不用担心它不危险。只需在手册中阅读它,因为您需要将“原子”映射到上面提到的 _NET_WM_PID
  • XListProperties - 使用您要查找的值搜索 _NET_WM_PID 属性

  • XConfigureWindow , XMoveWindow , XResizeWindow , ... - 最终执行您想做的任何事情。

上述所有功能都应记录在手册页中。只是使用man XOpenDisplay例如。

哦,一定要了解您可以使用的所有其他工具,以进一步研究 X Window 世界。运行xlsatoms,检查仅在单个(!)窗口xwininfo的输出中报告的获取列表的内容。xprop试着给自己设置一些,看看会发生xprop什么,如果你有礼貌地问的话,甚至会为你做这件事。

于 2013-03-29T17:16:01.717 回答