【发布时间】:2014-12-12 08:49:56
【问题描述】:
让我来布置场景。
我们有一个第 3 方应用程序(例如,安装到 C:\App 的 app.exe)。它实际上不能直接运行,它需要一个配置文件作为参数传递给它:“C:\App\app.exe config.ini”。每个人都已经有了包含必要参数的快捷方式。
此应用程序支持插件,我们已经开发了一些插件。为了分发上述插件,需要将它们复制到每个用户的 C:\App\Plugin\ 文件夹中,因此当进行更改时,我必须前往每个人的办公桌并确保更新得到应用。
这很麻烦,所以我开发了一个应用程序,它将扫描网络文件夹并将其与它的内部文件数据库进行比较。如果有任何更改,它会将文件复制到正确的目标文件夹。
但这并不是无缝的,因为用户必须确保 app.exe 已关闭 - 运行我的更新程序,然后重新运行 app.exe。所以我将原来的 app.exe 重命名为 app_launcher.exe,并将我的更新程序重命名为 app.exe。我修改了我的更新程序以支持参数,并在更新完成后将它们传递给 app_launcher.exe。一旦 app_launcher.exe 启动,更新程序就会关闭。
我应该注意 - 以上确实有效。
问题来自将应用快捷方式固定到任务栏的用户。一旦真正的应用程序最终启动,它就会在任务栏上获得自己的新图标,而不是与原始快捷方式分组。这实际上是有道理的,因为它们在技术上是两个不同的应用程序。然而,用户不喜欢这样。
我对此进行了一些研究,发现了一些可以让您将多个程序(垃圾箱/围栏)分组的第三方程序。我不想要这个。
更多的研究发现了一个叫做 AppUserModelID 的东西,这让我很感兴趣。在玩了一些之后,我让我的更新程序设置了它自己的 AppUserModelID。原始 app.exe 没有设置它的 AppUserModelID(通过 ProcessHacker 发现),但我能够通过 kernel32.dll 中的 CreateProcess 方法让更新程序使用它使用的相同 ID 启动它。
这不起作用。更新程序在它自己的固定图标下启动,原始应用程序启动一个新图标。我调整了更新程序以保持打开状态,直到原始应用程序关闭,看看这是否有所作为。这次它在自己的固定图标下启动,原始应用程序启动它自己的,然后更新程序窗口切换到与新图标下的原始应用程序分组。所以 AppUserModelID 确实将它们组合在一起,但不是我想要的。
我将 C# 用于更新程序应用程序,无法更改(或更改)原始应用程序。
如何让这些应用程序在固定的快捷方式下分组?有没有可能?
【问题讨论】: