1

我想从任何应用程序的跳转列表中找出最近/经常使用的项目。我知道我们可以使用 IApplicationDocumentLists 接口来做到这一点。但是我们需要 appUserModelId。所以现在我的问题是找出任何应用程序的 appUserModelId,给定它的 exe 路径。任何帮助将不胜感激。

4

2 回答 2

6

AppUserModeID 不是 EXE 文件本身的一部分,因此仅拥有 EXE 文件的路径是不够的。AppUserModeID 是在 EXE 运行时分配的,它们可以在进程范围或每个窗口的基础上分配。

要查询进程的显式AppUserModeID,您必须将代码注入该进程并让它调用GetCurrentProcessExplicitAppUserModelID(),然后使用 IPC 机制将值发送回您的主应用程序。

要查询窗口的显式AppUserModeID,可以使用SHGetPropertyStoreForWindow()获取窗口的IPropertyStore界面,然后调用IPropertyStore.GetValue()指定PKEY_AppUserModel_ID作为属性键。

请注意,在任何一种情况下,这些函数都仅适用于显式AppUserModeID。如果应用程序没有为自己分配显式 AppUserModeID,则它们不适用于Windows 分配的隐式AppUserModeID。这在文档中明确说明:

应用程序用户模型 ID (AppUserModelIDs)

某些应用程序不声明显式 AppUserModelID。它们是可选的。在这种情况下,系统使用一系列启发式方法来分配内部 AppUserModelID。但是,避免这些计算会带来性能优势,并且显式 AppUserModelID 是保证准确用户体验的唯一方法。因此,强烈建议设置显式 ID。应用程序无法检索系统分配的 AppUserModelID。

更新:在 Windows 8 中,微软增加了一个新GetApplicationUserModelId()功能:

获取指定进程的应用程序用户模型 ID 。

您可以使用它而不是注入代码来调用GetCurrentProcessExplicitAppUserModelID(). 我还没有尝试过,但我怀疑它会返回当前的 AppUserModeID,而不管它是如何分配的(显式分配的或系统分配的)。

于 2015-01-16T05:12:57.060 回答
0

您无法从 Exe 路径获取 AppUserModelId。这是不可能的。

但是您可以阅读我的帖子如何为当前用户枚举所有已安装 StoreApps 的所有 AppUserModelId:How to enumerate the installed StoreApps and their ID in Windows 8 and 10

于 2015-08-22T15:36:37.183 回答