Как найти основной исполняемый файл приложения - PullRequest
0 голосов
/ 27 февраля 2020

Я устанавливаю приложения программным способом без присмотра (ничего особенного, просто передавая параметры "/ VERYSILENT / SUPPRESSMSGBOXES / NORESTART", если exe, или "msiexe c / qn / i ALLUSERS = 1", в то время как файл MSI ).

Проблема в том, что после завершения установки я хочу открыть только что установленное приложение. Затем я ищу способ найти основной исполняемый файл только что установленного приложения.

Я пробовал отслеживать жесткий диск, а также проверять реестр, но я не нашел ничего надежного и универсального.

Как мне этого добиться?

1 Ответ

0 голосов
/ 28 февраля 2020

Я нашел подходящий способ, надеюсь, это может помочь кому-то еще.

В Windows 10 есть специальный скрытый объект оболочки, в котором перечислены все приложения (UWP и обычные), которые открываются в вот так:

  • Win + R
  • Поместите Shell: AppsFolder и выполните его.

Тогда вопрос состоит в том, чтобы получить список там программно и проверить что изменилось после установки.

Это достигается следующим образом (необходимо этот пакет nuget):

var appsFolderId = new Guid("{1e87508d-89c2-42f0-8a7e-645a0f50ca58}");
IKnownFolder appsFolder = KnownFolderHelper.FromKnownFolderId(appsFolderId);
foreach (var app in appsFolder)
{
  Console.WriteLine($"{app.Name} {app.ParsingName}");
}

app.Name - имя приложения и app.ParsingName - это имя, которое можно использовать для открытия приложения с помощью этого:

System.Diagnostics.Process.Start("explorer.exe", @" shell:appsFolder\" + app.ParsingName);

При необходимости значок приложения можно получить с помощью этого свойства:

app.Thumbnail.ExtraLargeBitmapSource

Кредиты для этого ответа для решения.

Теперь вопрос сохранения текущего списка, установки нового приложения и проверки изменений в этом списке после. Также как предлагает ответ ; вы можете прослушивать изменения этого шеллобъекта, чтобы получать уведомления, когда изменение вступает в силу, с помощью:

ShellObjectWatcher watcher = new ShellObjectWatcher(appsFolder, false);
watcher.AllEvents += <Your_events_handler>;
watcher.Start();
...