是否可以使用终端在各种窗口上模拟“关闭”事件?


15

我在Ask Ubuntu上回答gnome-terminal通过命令退出所有实例的情况,但是正如大家所看到的gnome-terminal,似乎没有SIG调用,我可以使用它来模拟此“ Close”事件。因此,这引起了我的疑问,在GNOME / KDE / LXDE / {是否将窗口/桌面管理器/环境放在此处}中,有没有一种方法可以模拟“单击关闭按钮”事件?我读过 不同的 问题 可能与此有任何关系,但不作答。

我正在寻找的是全局命令(如果存在)在不同情况下执行此操作。如果不存在,请说明“关闭”按钮的工作方式。

可能的用途:

Answers:


16

我相信相关的手册页是XKillClient。您可以xdotool像这样模拟从终端单击的关闭按钮。

假设我有一个gnome-terminal空地,它的名字是“ saml @ grinchy:/ home”。

  1. 获取窗口ID

    $ xdotool search --name "saml@grinchy:/home"
    96488188
    
  2. 发送给Alt+F4

    $ xdotool windowactivate --sync 96488188 key --clearmodifiers \
         --delay 100 alt+F4
    

您可以通过将第一个命令嵌入第二个命令来将它们放在一起:

$ xdotool windowactivate --sync $( ...1st command...) key --clearmodifiers \
         --delay 100 alt+F4

您可以xdotool同时执行以下两项操作来保存自己:

$ xdotool search --name "saml@grinchy:~" key alt+f4

全球范围

您可以修改我提供的内容以在具有相同名称的Windows上运行它:

$ xdotool search --name "saml@grinchy:~"
96488779
96468996

或在Windows上按其他属性。您可以xwininfo用来查找有关特定窗口的更多信息。运行它,然后单击感兴趣的窗口:

$ xwininfo

xwininfo: Please select the window about which you
          would like information by clicking the
          mouse in that window.

xwininfo: Window id: 0x5c04d4b "saml@grinchy:~"

  Absolute upper-left X:  14
  Absolute upper-left Y:  74
  Relative upper-left X:  14
  Relative upper-left Y:  74
  Width: 941
  Height: 361
  Depth: 32
  Visual: 0x62
  Visual Class: TrueColor
  Border width: 0
  Class: InputOutput
  Colormap: 0x5c00003 (not installed)
  Bit Gravity State: NorthWestGravity
  Window Gravity State: NorthWestGravity
  Backing Store State: NotUseful
  Save Under State: no
  Map State: IsViewable
  Override Redirect State: no
  Corners:  +14+74  -485+74  -485-465  +14-465
  -geometry 132x24+14+74

处理X11窗口时,其他有用的工具是xdpyinfoxpropxdpyinfo可用于查找有关X服务器的信息。因此,您可以找出哪个窗口具有焦点:

$ xdpyinfo |grep focus
focus:  window 0x5c00005, revert to Parent

xpropxwininfo可以进行-id切换,因此您可以向他们提供您感兴趣的Window ID,而不必单击它:

$ xprop -id 0x5c00001|grep -i class
WM_CLASS(STRING) = "gnome-terminal", "Gnome-terminal"

参考文献


我认为我们可以进一步简化使用xdotool search --name "saml@grinchy:~" key alt+f4,问题是我还没有找到如何使用多个具有相同名称的窗口来执行此操作的方式
Braiam 2013年

@Braiam-他们有什么独特之处吗?调用窗口时,您可以告诉GNOME您想要的标题是什么。
slm

@Braiam-例如:wmctrl -r :ACTIVE: -N "MyWindowTitle
slm

1
我正在尝试使用此处提供的示例将s发送key alt+F4到所有窗口(如果可以调整大小,为什么不使用alt + F4),但是没有运气。并感谢:D。
Braiam

1
鼠标高估了:/。我解决了这个问题,xdotool search --name "gedit|terminal|office" key --window %@ alt+F4将查找标题名称中包含gedit,terminal或office的任何窗口,并发送alt + F4命令。
Braiam

1

我发现xdotool它是片状/越野车,有时会关闭前景窗口,而不是应该关闭的窗口。这似乎是由于将窗口置于前台之后而不是直接发送窗口事件而发送键的方式造成的,这是一个非常令人讨厌的问题。我建议使用wmctrl,它直接关闭窗口而不发送键击。

您可以通过匹配名称直接关闭窗口,例如,这两个都将关闭“无标题文档1-gedit”窗口:

wmctrl -c "gedit"
wmctrl -c "Untitled"

您可以使用该-F选项仅考虑完全匹配:

wmctrl -F -c "Untitled Document 1 - gedit"

或者,您可以直接提供ID:

wmctrl -i -c "121634821"

这里可以找到更多的用法示例/文档。

我发现非常有用的一件事是xdotool的能力,它可以使用--sync参数等待直到有结果为止。将两个命令合二为一,如下所示:

xdotool search --sync --name "gedit" | xargs wmctrl -i -c

如果您使用的是Mac,则可能需要使用以下-I{}参数:

xdotool search --sync --name "gedit" | xargs -I{} wmctrl -i -c {}

如果要支持多个窗口,则应使用选项告诉每次xargs调用wmctrl最多带有1个参数-nwmctrl不明确支持多个窗口作为参数:

xdotool search --sync --name "gedit" | xargs -I{} -n 1 wmctrl -i -c {}

这将等待,直到至少有1个这样的窗口,然后关闭所有窗口。


我会得到“您确定”提示对话框吗?
Braiam '16

@Braiam是的,我刚刚测试了它。top当然,仅当程序正在终端中运行时(例如),与单击关闭按钮时一样。
jmiserez

xdotool search --sync --name "Software Updater" | xargs wmctrl -i -c在Trusty上运行,并启动了Software Updater。从现在开始,Software Updater无法正确显示。仅显示标题栏。重新安装更新管理器没有帮助。
jarno

高兴地退出并返回Xfce会话确实有所帮助。
佳诺

使用xdotool或xprop实用程序都找不到“ gedit”。这仅适用于“ gedit”,我可以找到其他程序。xdotool search --sync --name“ gedit”命令不会返回结果。有人可以帮忙吗?Ubuntu 17
Gonki

-1

pkill(1)应该是您所需要的。


3
不,如果我使用的--signal开关与kill或相同,它将不会在我的任何测试中模拟“关闭”事件(打开gedit,LibreOffice和终端,编写内容,发送命令)killall。我希望您要保存?警报。
Braiam

您说得对,似乎我误解了您的问题。
schaiba
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.