如何使用 vc++ 获取 Windows 7/8 中任何应用程序的 appUserModelId



我想从任何应用程序的跳转列表中找出最近/频繁的项目。我知道我们可以使用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

相关内容

  • 没有找到相关文章

最新更新