【问题标题】:How to discover the main executable file of an application如何发现应用程序的主要可执行文件
【发布时间】:2020-06-11 20:50:32
【问题描述】:

我正在以无人值守的方式以编程方式安装应用程序(没什么特别的,如果是 exe,只需传递参数“/VERYSILENT /SUPPRESSMSGBOXES /NORESTART”,或者当是 msi 文件时传递参数“msiexec /qn /i ALLUSERS=1”)。

问题是安装成功后我想打开刚刚安装的应用程序。然后我正在寻找一种方法来发现我刚刚安装的应用程序的主要可执行文件。

我尝试过监控硬盘并检查注册表,但我没有发现任何强大且通用的东西。

我怎样才能做到这一点?

【问题讨论】:

  • 您在注册表中检查了什么?
  • 一般你不能这样做,因为没有必须遵循的硬模式。您需要做的是找到解决问题的不同方法。
  • @RobertHarvey 我一直在检查 HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall 的卸载列表,但在大多数情况下它不会暴露 exe 文件的路径。
  • @DavidHeffernan 我正在创建的东西不知何故是一个“商店”应用程序,它允许将应用程序安装到系统中并打开它们..你能指出我正确的方向吗? :)
  • 没有方向,没有左也没有右,也没有右也没有错。这个问题没有解决办法。

标签: c# windows winapi windows-installer


【解决方案1】:

我找到了一个合适的方法,我希望这可以帮助其他人。

Windows 10 中有一个特殊的隐藏 shell 对象,它列出了所有以这种方式打开的应用程序(UWP 和常规):

  • Win + R
  • 放入 Shell:AppsFolder 并执行它。

接下来就是以编程方式获取列表并检查安装后发生的变化的问题。

这是通过这种方式实现的(需要thisnuget包):

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

感谢this answer 的解决方案。

那么现在是存储当前列表、安装新应用并在之后检查该列表上的更改的问题。也正如the answer 建议的那样;您可以监听该 shellobject 上的更改,以便在更改生效时收到通知:

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

【讨论】:

    猜你喜欢
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 2016-08-17
    • 2020-03-08
    • 1970-01-01
    • 2012-01-08
    • 2014-03-19
    相关资源
    最近更新 更多