如何杀死所有打开的窗户?


9

我想关闭桌面上出现的所有窗口。我曾经想过要这样做pkill,但我一次只能杀死一个,这不是我想要的。最终目标是将其放入脚本中以运行信息亭,它将检测信息亭软件是否正在运行(我认为这部分已解决),如果没有运行,则它将杀死所有打开的窗口,然后重新启动信息亭软件。


如何重新启动gdm或kdm
Raza

Answers:


3

最简单的方法是xdotool

xdotool search "" windowkill %@

xdotool search ""列出每个窗口。windowkill %@杀死他们每个人;%@指上一次搜索的所有结果。

您可能更喜欢使用该--maxdepth 1选项search所选窗口限制为顶级窗口。


1
遗憾的是,使用VNC时它不起作用(xdotool会引发分段错误)。
Diego Queiroz

这可能是另一个值得一提的问题-在VNC下,情况是否应该相同。
Michael Homer

我同意,但事实并非如此。有关于此问题的错误报告:github.com/jordansissel/xdotool/issues/126
Diego Queiroz

2

这至少对kde和xfce有效(未测试gnome,但也可能有效):

1)安装wmctrl

2)然后创建一个名为close_windows.sh

# close all open windows gracefully without closing the Desktop environment
WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
for i in $WIN_IDs; do wmctrl -ic "$i"; done
# Keep checking and waiting until all windows are closed (you probably don't need this section)
while test $WIN_IDs; do 
    sleep 0.1; 
    WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
done 

3)使其可执行:chmod +x ./close_windows.sh

3)在开始菜单中创建一个指向close_windows脚本的条目。

4)从此条目执行close_windows脚本。

来源:https : //forum.manjaro.org/index.php?topic=4412.0


完美的解决方案。它也可以与VNC一起使用。重要的补充是您可能需要更改“ Desktop $”以匹配您的安装本地化(例如,葡萄牙语中为“Áreade trabalho $”)。
Diego Queiroz

2

迈克尔·霍默Michael Homer)吉多·范·斯蒂恩(Guido van Steen)展示了杀死所有窗户的方法。如果有的话,这不会杀死后台进程。它不会杀死崩溃的程序,这些程序的窗口已经消失,但是在没有用户界面的情况下仍然可以执行。因此,您可能更喜欢取消进程。

您可以kill -9 -1以非root用户身份运行以杀死以该用户身份运行的所有进程。您需要以专用用户身份运行信息亭应用程序(无论如何,这都是信息亭的标准配置,以确保安全性),并确保当会话中的所有进程都死机时,信息亭界面会重新启动(这也是信息亭的标准配置,以提高稳定性)。


0

Guido的答案非常适合我。我编写了一个用Lazarus / FPC编译的小型Linux / Windows可交叉编译的Pascal prog,供我自己使用,它启动了他的wmctrl命令或等效的Powershell Windows命令:

program CloseAll;
{Ferme toutes les fenêtres}
{$mode objfpc}{$H+}
uses
    Classes, SysUtils, Process, Crt;

var
  p: TProcess;
 // i: integer=0;
  {$R *.res}
begin
      p := TProcess.Create(nil);
    try
        p.ShowWindow := swoHIDE; // Cache la console
        {$ifdef windows}
        p.Executable := 'cmd.exe';
        p.Parameters.Add('powershell -command "(New-Object -comObject Shell.Application).Windows() | foreach-object {$_.quit()}; Get-Process | Where-Object {$_.MainWindowTitle -ne \"\"} | stop-process"');
        {$else}
        p.Executable := '/bin/bash';
        p.Parameters.Add('-c');
        //close all open windows gracefully without closing the Desktop environment
        p.Parameters.Add ('WIN_IDs=$(wmctrl -l | grep -vwE "Bureau$|xfce4-panel$" | cut -f1 -d' + #39 + ' ' + #39 + ')' +#10 + 'for i in $WIN_IDs; do wmctrl -ic "$i"; done');
        //p.Options := p.Options + [poWaitOnExit, poUsePipes];
        {$endif}
        p.Execute;
    finally
        p.Free
    end
end.

我还注意到Diego的桌面名称是正确的,我的Linux可执行文件仅在桌面名为“ Bureau”的法语xfce环境中可以使用。我无法在环境变量中找到桌面名称(这是不值得的)。

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.