Відповідь Гуйдо прекрасно працює на мене. Я написав невеликий перехресний компілюваний прогрес Pascal Linux / Windows, складений разом із Lazarus / FPC для власного використання, який запускає його команду wmctrl або еквівалентну команду Windows Powershell:
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.
Я також помітив, що Дієго має рацію щодо назви робочого столу, і мій виконуваний Linux працюватиме лише у французькому середовищі xfce із робочим столом під назвою "Бюро". Мені не вдалося знайти ім'я робочого столу в змінних оточення (і це не вартувало проблем).