让我布置场景。
我们有第三方应用程序(例如,app.exe安装到C:\ App)。它实际上不能直接运行,它需要一个配置文件作为参数传递给它:" C:\ App \ app.exe config.ini"。每个人都有包含必要参数的快捷方式。
此应用程序支持插件,我们已经开发了一些插件。为了分发所述插件,需要将它们复制到每个用户C:\ App \ Plugin \文件夹,因此当进行更改时,我必须到各个人的办公桌前,并确保更新得到应用。
这很麻烦,所以我开发了一个应用程序,它将扫描网络文件夹并将其与文件的内部数据库进行比较。如果有任何更改,它会将文件复制到正确的目标文件夹。
这不是无缝的,因为用户必须确保app.exe已关闭 - 运行我的更新程序,然后重新运行app.exe。所以我将原来的app.exe重命名为app_launcher.exe,将我的更新程序重命名为app.exe。我修改了我的updater应用程序以支持参数,并在更新完成后将它们传递给app_launcher.exe。 app_launcher.exe启动后,更新程序将关闭。
我应该注意 - 上面的确实有效。
问题来自将应用程序快捷方式固定到任务栏的用户。一旦真正的应用程序最终启动,它就会在任务栏上获得它自己的新图标,而不是与原始快捷方式分组。这实际上是有道理的,因为它们在技术上是两种不同的应用然而,用户并不喜欢这样。
我对此做了一些研究,发现了一些第三方程序可以让你对多个程序进行分组(Bins / Fences)。我不想这样。
更多的研究揭示了一些叫做AppUserModelID的东西,这引起了我的兴趣。经过一些游戏后,我让我的更新程序设置了它自己的AppUserModelID。原来的app.exe没有设置它的AppUserModelID(通过ProcessHacker发现),但我能够通过kernel32中的CreateProcess方法获取更新程序以使用相同的ID启动它的.dll。
这不起作用。更新程序在它自己的固定图标下启动,原始应用程序启动了一个新图标。我调整了更新程序以保持打开,直到原始应用程序关闭,看看是否有所作为。这次它是在它自己的固定图标下启动的,原始应用程序启动它自己,然后更新程序窗口切换为与新图标下的原始应用程序分组。所以AppUserModelID确实将它们组合在一起,但不是我想要的。
我正在使用C#作为更新程序应用程序,并且无法对原始应用程序进行更改(或对其进行更改)。
如何在固定的快捷方式下将这些应用程序分组?它甚至可能吗?
答案 0 :(得分:0)
我想我可能找到了一个解决方案,虽然它有点像黑客。
问题来自最终应用程序与正在运行的快捷方式不匹配。
因此,我确保更新程序应用程序始终在真正的exe之前运行,而不是替换EXE并在完成后运行真实的程序。
唯一需要注意的是,它也可以在系统上运行每个exe(通过HKCR \ exefile)。第一个参数现在是真正可执行文件的路径,如果它与应用程序匹配则运行更新程序。一旦更新程序完成或者它是任何其他应用程序,它就会运行它。
不是理想的解决方案(因为它可能被检测为恶意软件),但它应该对我们有用。