2015-01-16 126 views
1

我想从任何应用程序的跳转列表中找出最近/频繁的项目。我知道我们可以使用IApplicationDocumentLists接口来做到这一点。但是我们需要appUserModelId。所以现在我的问题是找出appUserModelId任何应用程序,给定其exe路径。任何帮助将不胜感激。如何使用vC++在Windows 7/8中获取appUserModelId

回答

5

AppUserModeIDs不是EXE文件本身的一部分,因此仅具有EXE文件的路径是不够的。 AppEserModeID在EXE运行时分配,并且可以在整个进程或每个窗口的基础上分配。

要查询过程的明确 AppUserModeID,你就必须将代码注入到该进程,并调用它GetCurrentProcessExplicitAppUserModelID(),然后使用IPC机制将值发送回你的主应用程序。

要查询窗口的明确 AppUserModeID,您可以使用SHGetPropertyStoreForWindow()得到窗口的IPropertyStore接口,然后调用IPropertyStore.GetValue()指定PKEY_AppUserModel_ID的属性键。

请注意,在这两种情况下,这些功能仅适用于明确的 AppUserModeID。它们不适用于隐式如果应用程序未为其自身分配明确的AppUserModeID,则由Windows分配的AppUserModeID。这是在文档中明确提出:

Application User Model IDs (AppUserModelIDs)

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

更新:在Windows 8中,微软增加了一个新的GetApplicationUserModelId()功能:

获取application user model ID指定进程。

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

+0

感谢您的输入。那么没有其他方法可以获得任何应用程序的跳转列表吗?因为我试图获取appUserModelId,然后jumpList IPropertyStore的方式,但我无法得到,因为大多数这些应用程序没有定义明确的userModelId。所以这种方法不适合我。我想要获得任何应用程序的跳转列表。 – Shashank

+0

如果没有AppUserModeID,没有办法获得跳转列表,并且没有办法获得由Windows隐式创建的AppUserModeID(除非您反向工程Windows来找出它用于创建其隐式AppUserModeID的启发式算法) 。 –

+0

非常感谢您的意见。这真的很有帮助 – Shashank