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