2015-01-16 77 views
1

我想從任何應用程序的跳轉列表中找出最近/頻繁的項目。我知道我們可以使用IApplicationDocumentLists接口來做到這一點。但是我們需要appUserModelId。所以現在我的問題是找出appUserModelId任何應用程序,給定其exe路徑。任何幫助將不勝感激。如何使用vC++在Windows 7/8中獲取appUserModelId

回答

5

AppUserModeIDs不是EXE文件本身的一部分,因此僅具有EXE文件的路徑是不夠的。 AppEserModeID在EXE運行時分配,並且可以在整個進程或每個窗口的基礎上分配。

要查詢過程的明確 AppUserModeID,你就必須將代碼注入到該進程,並調用它GetCurrentProcessExplicitAppUserModelID(),然後使用IPC機制將值發送回你的主應用程序。

要查詢窗口的明確 AppUserModeID,您可以使用SHGetPropertyStoreForWindow()得到窗口的IPropertyStore接口,然後調用IPropertyStore.GetValue()指定PKEY_AppUserModel_ID的屬性鍵。

請注意,在這兩種情況下,這些功能僅適用於明確的 AppUserModeID。它們不適用於隱式如果應用程序未爲其自身分配明確的AppUserModeID,則由Windows分配的AppUserModeID。這是在文檔中明確提出:

Application User Model IDs (AppUserModelIDs)

一些應用程序不聲明明確AppUserModelID。它們是可選的。 在這種情況下,系統使用一系列啓發法來分配內部AppUserModelID。但是,避免這些計算會帶來性能優勢,並且明確的AppUserModelID是保證精確用戶體驗的唯一方法。因此,強烈建議設置一個明確的ID。 應用程序無法檢索系統分配的AppUserModelID。

更新:在Windows 8中,微軟增加了一個新的GetApplicationUserModelId()功能:

獲取application user model ID指定進程。

您可以使用它代替注入代碼來調用GetCurrentProcessExplicitAppUserModelID()。我還沒有嘗試過,但我懷疑它會返回當前的AppUserModeID,無論它如何分配(顯式或系統分配)。

+0

感謝您的輸入。那麼沒有其他方法可以獲得任何應用程序的跳轉列表嗎?因爲我試圖獲取appUserModelId,然後jumpList IPropertyStore的方式,但我無法得到,因爲大多數這些應用程序沒有定義明確的userModelId。所以這種方法不適合我。我想要獲得任何應用程序的跳轉列表。 – Shashank

+0

如果沒有AppUserModeID,沒有辦法獲得跳轉列表,並且沒有辦法獲得由Windows隱式創建的AppUserModeID(除非您反向工程Windows來找出它用於創建其隱式AppUserModeID的啓發式算法) 。 –

+0

非常感謝您的意見。這真的很有幫助 – Shashank