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

Sha*_*ank 1 winapi jump-list visual-c++

我想从任何应用程序的跳转列表中找出最近/频繁的项目.我知道我们可以使用IApplicationDocumentLists接口来做到这一点.但我们需要appUserModelId.所以现在我的问题是找出适用于任何app的appUserModelId,给出它的exe路径.任何帮助将受到高度赞赏.

Rem*_*eau 6

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

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

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

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

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

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

更新:在Windows 8中,Microsoft添加了一项新GetApplicationUserModelId()功能:

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

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