Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
移动窗口Linux C 我想用C++实现一个函数,它可以在Linux中移动一个窗口。所以我在窗户下试过。但是我很难为Linux编译它。 有什么办法可以用Qt来做吗?因为我还没有找到一个,所以我试着为Linux编译_C++_Linux_Window - Fatal编程技术网

移动窗口Linux C 我想用C++实现一个函数,它可以在Linux中移动一个窗口。所以我在窗户下试过。但是我很难为Linux编译它。 有什么办法可以用Qt来做吗?因为我还没有找到一个,所以我试着为Linux编译

移动窗口Linux C 我想用C++实现一个函数,它可以在Linux中移动一个窗口。所以我在窗户下试过。但是我很难为Linux编译它。 有什么办法可以用Qt来做吗?因为我还没有找到一个,所以我试着为Linux编译,c++,linux,window,C++,Linux,Window,我正在使用MoveWindow函数,它是Windows API的一部分。是否有与Linux相当的工具?如果您不想这样做,您不必手动操作,因为已经有很多工具可以执行移动、调整大小、最大化窗口等任务 有一个工具名为wmctrl,您可能想更仔细地了解一下,即使您不打算使用它,也可以通过查看源代码找到一些有趣的技巧 移动窗口的任务只有创建窗口的客户机的pid知道,这可能不是最简单的任务,原因有二 首先,你真的不应该尝试这样做,因为在X Windows哲学中,窗口管理器的工作就是在屏幕上排列窗口 ICC

我正在使用MoveWindow函数,它是Windows API的一部分。是否有与Linux相当的工具?

如果您不想这样做,您不必手动操作,因为已经有很多工具可以执行移动、调整大小、最大化窗口等任务

有一个工具名为
wmctrl
,您可能想更仔细地了解一下,即使您不打算使用它,也可以通过查看源代码找到一些有趣的技巧

移动窗口的任务只有创建窗口的客户机的pid知道,这可能不是最简单的任务,原因有二

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

    ICCCM(请参阅:)和EWM规范(请参阅:)都强烈阻止任何客户机尝试自行移动或调整大小。最有可能的是,移动另一个客户端“拥有”的窗口可能被认为是更大的罪恶

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

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

幸运的是,它并没有那么糟糕,因为EWMH规范鼓励任何客户机在其顶层窗口(创建窗口的客户机的PID)上设置\u NET\u WM\u PID属性

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

可能性 虽然在此之前提到的所有观点似乎都有局限性,但事实上很可能恰恰相反。即使实际上,完全搞乱X会话中运行的任何其他客户机都是相对容易的,关于如何在X word中成为一个好公民的整套规则也被引入

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

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

Xlib 说到Xlib,到目前为止我从未使用过任何xcb,所以我不能告诉你太多关于它的信息,可能是以下方法可能有用

  • XOpenDisplay-打开与X服务器的连接
  • XQueryTree-获取服务器上当前活动的windows树
  • XInternAtom-不用担心,这并不危险。只要在手册中读一下就可以了,因为你需要得到上面提到的“atom”映射到_NET_WM_PID
  • XListProperties-使用您要查找的值搜索_NET\u WM\u PID属性

  • XConfigureWindowXMoveWindowXResizeWindow,…-最终完成你想做的事情

上述所有功能应记录在手册页面中。例如,只需使用
manxopendisplay


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

tldr:X窗口系统很糟糕示例:我正在制作桌面应用程序,在调试版本中,我希望UI窗口在启动时始终移动到某个位置。和要移动到其正下方的同一应用程序的控制台输出窗口。事实上,我不能在linux上用类似于单个
MoveWindow
调用的东西可靠地做到这一点,这绝对是愚蠢的。这可能取决于我的观点。作为一个弹出窗口的用户,我应该选择哪一个窗口,而不是开发者的决定,或者硬编码他或她对放置窗口的“正确”位置的看法。在这种特殊情况下,X哲学意味着不多也不少:普通只是让用户自己决定,好吗?。我所知道的几乎所有WindowManager都为用户提供了一个明确指定应在何处弹出哪个窗口以及窗口大小的机会。因此,至少对我来说,有一些工具忽略我的任何选择将是真正的麻烦。确切地说,用户应该始终能够通过调用OS API MoveWindow调用,手动(使用键盘或鼠标)或以编程方式将窗口定位到他想要的任何位置。X window system没有可靠的方法来实现这一点,因为它的故障无法修复。希望Wayland(或任何将要取代X的人)不会有同样的问题。换句话说,用户无法对windows的放置位置进行一致、直接的控制。然后给了一个愚蠢的软件——又名——窗口管理器。用户唯一的选择是1)编写自己的窗口管理器,或2)在没有窗口管理器的情况下使用X11。这是一个多么美好的世界啊