我想从任何应用程序的跳转列表中找出最近/频繁的项目。我知道我们可以使用IApplicationDocumentLists接口来做到这一点。但是我们需要appUserModelId。所以现在我的问题是找出任何应用程序的appUserModelId,给定其exe路径。任何帮助将不胜感激。
AppUserModeID 不是 EXE 文件本身的一部分,因此仅具有 EXE 文件的路径是不够的。 AppUserModeID 是在 EXE 运行时分配的,可以在进程范围内或每个窗口的基础上分配它们。
若要查询进程的显式 AppUserModeID,必须将代码注入该进程并让它调用 GetCurrentProcessExplicitAppUserModelID()
,然后使用 IPC 机制将值发送回主应用。
若要查询窗口的显式 AppUserModeID,可以使用 SHGetPropertyStoreForWindow()
获取窗口的IPropertyStore
接口,然后调用IPropertyStore.GetValue()
指定PKEY_AppUserModel_ID
作为属性键。
请注意,无论哪种情况,这些函数仅适用于显式 AppUserModeID。 如果应用未为自己分配显式应用用户模式 ID,则它们不适用于由 Windows 分配的隐式应用用户模式 ID。 这在文档中有明确说明:
应用程序用户模型 ID (应用程序用户模型 ID)
某些应用程序不声明显式的 AppUserModelID。它们是可选的。在这种情况下,系统使用一系列启发式方法来分配内部 AppUserModelID。但是,避免这些计算具有性能优势,显式 AppUserModelID 是保证准确用户体验的唯一方法。因此,强烈建议设置显式 ID。应用程序无法检索系统分配的应用用户模型 ID。
更新:在Windows 8中,Microsoft添加了一个新的GetApplicationUserModelId()
功能:
获取指定进程的应用程序用户模型 ID。
您可以使用它而不是注入代码来调用GetCurrentProcessExplicitAppUserModelID()
。 我还没有尝试过,但我怀疑它返回当前的AppUserModeID,无论它是如何分配的(显式或系统分配的)。
您无法从 Exe 路径获取 AppUserModelId。这是不可能的。
但是您可以阅读我的帖子,如何枚举当前用户所有已安装的StoreApps的所有AppUserModelId:如何在Windows 8和10中枚举已安装的StoreApps及其ID