2014-10-16 66 views
0

讓我來佈局場景。Windows 7+上的Multiapp任務欄分組

我們有第三方應用程序(比如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啓動,updater程序關閉。

我應該注意 - 上面的實際工作。

問題來自將應用程序快捷方式固定到任務欄的用戶。一旦真正的應用程序終於開始,它就會在任務欄上獲取它自己的新圖標,而不是與原始快捷方式進行分組。這實際上是有道理的,因爲它們在技術上是兩種不同的應用。但用戶不喜歡這樣。

我已經做了一些研究,並發現了一些第三方程序,可以讓你分組多個程序(Bins/Fences)。我不想要這個。

更多的研究揭示了一種叫做AppUserModelID的東西,這讓我很感興趣。在玩過一段時間後,我得到我的更新程序來設置它自己的AppUserModelID。原始的app.exe沒有設置它的AppUserModelID(通過ProcessHacker發現),但是我能夠使用它通過kernel32.dll中的CreateProcess方法使用的相同ID來啓動它。

這是行不通的。更新程序在它自己的固定圖標下啓動,原始應用程序啓動了一個新圖標。我調整了更新程序以保持打開狀態,直到原始應用程序關閉,以查看是否有所作爲。這次它開始在它自己的固定圖標下,原始應用程序啓動它自己的,然後更新窗口切換到與新圖標下的原始應用程序分組。所以AppUserModelID將它們組合在一起,但不是我想要的。

我正在使用C#作爲更新程序應用程序,並且無法對原始應用程序進行更改(或對其進行更改)。

如何讓這些應用程序在固定的快捷方式下進行分組?它甚至有可能嗎?

回答

0

我想我可能找到了一個解決方案,雖然這有點破解。

問題來自最終應用程序與正在運行的快捷方式不匹配。

因此,我沒有更換EXE並在完成時運行真實的EXE,而是確保updater應用程序總是在真正的exe之前運行。

唯一需要注意的是,它也運行在系統上的每個exe文件(通過HKCR \ exefile)。第一個參數現在是真實可執行文件的路徑,如果它匹配運行更新程序的應用程序。一旦更新完成或者它是任何其他應用程序,它就會運行它。

不是一個理想的解決方案(因爲它可能被檢測爲惡意軟件),但它應該爲我們工作。

+0

好的 - 這個解決方案也不是很好。它阻止了一些系統工具的運行。一些英特爾啓動程序(igfx stuff)和msconfig。顯然,通過這些程序觸發的更新程序認爲程序不存在。 – Chris 2014-10-22 13:04:36