Jawaban Guido sangat cocok untuk saya. Saya menulis prog Linux Pascal Linux / cross-compilable kecil yang dikompilasi dengan Lazarus / FPC untuk saya gunakan sendiri, yang meluncurkan perintah wmctrl-nya, atau perintah windows Powershell yang setara:
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.
Saya juga memperhatikan bahwa Diego benar tentang nama desktop, dan executable Linux saya hanya akan bekerja pada lingkungan xfce Prancis dengan desktop bernama "Bureau". Saya tidak dapat menemukan nama desktop di variabel lingkungan (dan itu tidak sepadan dengan masalahnya).