如何使用 vc++ 获取 windows 7/8 中任何应用程序的 appUserModelId
How to get appUserModelId for any app in windows 7/8 using vc++
我想从任何应用的跳转列表中找出 recent/frequent 项。我知道我们可以使用 IApplicationDocumentLists 接口来做到这一点。但是为此我们需要 appUserModelId。所以现在我的问题是找出任何应用程序的 appUserModelId,给定它的 exe 路径。任何帮助将不胜感激。
AppUserModeIDs 不是 EXE 文件本身的一部分,所以仅仅有 EXE 文件的路径是不够的。 AppUserModeID 在 EXE 为 运行 时分配,并且可以在进程范围内或按 window 分配。
要查询进程的 explicit AppUserModeID,您必须将代码注入该进程并让它调用 GetCurrentProcessExplicitAppUserModelID()
,然后使用 IPC 机制发送值回到您的主应用程序。
要查询 window 的 显式 AppUserModeID,您可以使用 SHGetPropertyStoreForWindow()
to get the window's IPropertyStore
interface, and then call IPropertyStore.GetValue()
指定 PKEY_AppUserModel_ID
作为 属性 键.
请注意,在任何一种情况下,这些函数仅适用于 explicit AppUserModeIDs。如果应用没有为自己分配明确的 AppUserModeID,则它们不适用于由 Windows 分配的 implicit AppUserModeID。这在文档中有明确说明:
Application User Model IDs (AppUserModelIDs)
Some applications do not declare an explicit AppUserModelID. They are optional. In that case, the system uses a series of heuristics to assign an internal AppUserModelID. However, there is a performance benefit in avoiding those calculations and an explicit AppUserModelID is the only way to guarantee an exact user experience. Therefore, it is strongly recommended that an explicit ID be set. Applications cannot retrieve a system-assigned AppUserModelID.
更新:在Windows8中,微软添加了一个新的GetApplicationUserModelId()
函数:
Gets the application user model ID for the specified process.
您可以使用它而不是注入代码来调用 GetCurrentProcessExplicitAppUserModelID()
。我还没有尝试过,但我怀疑它 returns 当前的 AppUserModeID 不管它是如何分配的(显式或系统分配)。
您无法从 Exe 路径获取 AppUserModelId。这不可能。
但是你可以阅读我的帖子如何为当前用户枚举所有已安装 StoreApps 的所有 AppUserModelId:
我想从任何应用的跳转列表中找出 recent/frequent 项。我知道我们可以使用 IApplicationDocumentLists 接口来做到这一点。但是为此我们需要 appUserModelId。所以现在我的问题是找出任何应用程序的 appUserModelId,给定它的 exe 路径。任何帮助将不胜感激。
AppUserModeIDs 不是 EXE 文件本身的一部分,所以仅仅有 EXE 文件的路径是不够的。 AppUserModeID 在 EXE 为 运行 时分配,并且可以在进程范围内或按 window 分配。
要查询进程的 explicit AppUserModeID,您必须将代码注入该进程并让它调用 GetCurrentProcessExplicitAppUserModelID()
,然后使用 IPC 机制发送值回到您的主应用程序。
要查询 window 的 显式 AppUserModeID,您可以使用 SHGetPropertyStoreForWindow()
to get the window's IPropertyStore
interface, and then call IPropertyStore.GetValue()
指定 PKEY_AppUserModel_ID
作为 属性 键.
请注意,在任何一种情况下,这些函数仅适用于 explicit AppUserModeIDs。如果应用没有为自己分配明确的 AppUserModeID,则它们不适用于由 Windows 分配的 implicit AppUserModeID。这在文档中有明确说明:
Application User Model IDs (AppUserModelIDs)
Some applications do not declare an explicit AppUserModelID. They are optional. In that case, the system uses a series of heuristics to assign an internal AppUserModelID. However, there is a performance benefit in avoiding those calculations and an explicit AppUserModelID is the only way to guarantee an exact user experience. Therefore, it is strongly recommended that an explicit ID be set. Applications cannot retrieve a system-assigned AppUserModelID.
更新:在Windows8中,微软添加了一个新的GetApplicationUserModelId()
函数:
Gets the application user model ID for the specified process.
您可以使用它而不是注入代码来调用 GetCurrentProcessExplicitAppUserModelID()
。我还没有尝试过,但我怀疑它 returns 当前的 AppUserModeID 不管它是如何分配的(显式或系统分配)。
您无法从 Exe 路径获取 AppUserModelId。这不可能。
但是你可以阅读我的帖子如何为当前用户枚举所有已安装 StoreApps 的所有 AppUserModelId: