我可以设置通过跳转列表启动的任意进程的AppUserModelID吗?

时间:2011-01-17 09:33:02

标签: c++ windows-7 taskbar jump-list

我有一个用C ++编写的简单控制台应用程序,它充当通过它的跳转列表启动另一个应用程序的存根。目的是将跳转列表功能添加到不支持此功能的应用程序。称之为stub.exe。运行stub.exe时,它会使用以下步骤创建自定义跳转列表(从MS样本中采取正确的步骤):

create an ICustomDestinationList
ICustomDestinationList::BeginList()
create an IObjectCollection
for_each item_to_add
  create an IShellLink, set its path/arguments/title/icon
  add IShellLink to the IObjectCollection
get the IObjectArray interface from the IObjectCollection
call ICustomDestinationList::AddUserTasks( IObjectArray interface )
ICustomDestinationList::CommitList()

将stub.exe固定到任务栏并右键单击它时,会出现跳转并包含所有添加的IShellLink。单击某个项目时,它将启动相应的过程。

现在,我希望通过此跳转列表启动的进程将其窗口分组在stub.exe的任务栏图标下,而不是拥有自己的组。他们关键的工作似乎是AppUsermodelID。这是我到目前为止所尝试的:

  • 仅用于测试,创建几个快捷方式并通过IPropertyStore-> SetValue(PKEY_AppUserModel_ID,“id”)设置id。实际上,在启动这些快捷方式时,它们都将分组在相同的任务栏图标下。
  • 由于快捷方式符合我的要求,我尝试在stub.exe的跳转列表中添加快捷方式:没有效果。快捷方式甚至没有显示在跳转列表中(可能没有捷径的快捷方式?),但所有方法都返回S_OK
  • 在每个加入跳转列表的IShellLinks上设置PKEY_AppUserModel_ID:无效
  • 调用ICustomDestinationList-> SetAppID():无效
  • 而不是使用SubTasks,尝试使用SHAddToRecentDocs:没有效果。最近的文档列表没有显示出来。但现在事情变得混乱了。在负责固定任务栏项目的快捷方式(%APPDATA%/漫游/ Microsoft / Internet Explorer /快速启动/用户固定/任务栏中的一个)上设置AppUserModelID后,跳转列表发生了变化:它没有显示'任务'item',但确实显示'Recent'和我使用SHAddToRecentDocs添加的项目。现在点击它们时,我得到一个标题以“d:\ desktop”开头,后跟中文字符的对话框。将项目悬停在跳转列表中也会显示中文字符而不是我设置的描述。

问题:

  1. 跳转列表中的中文字符是什么?
  2. 如何在任务栏快捷方式上设置应用ID以在“任务”和“最近”部分之间切换,为什么它们不在同一个?
  3. 如果可能的话,会有什么方法来实现我真正想要的东西:一个自定义的跳转列表,其中启动的项目将在其任务栏图标下分组? (请注意,我计划将他们的流程设置为当前没有设置应用ID)

1 个答案:

答案 0 :(得分:1)

这里反应不多;]

与此同时,我设法自己解决了主要问题;它不是一个简单的解决方案,但它满足了要求:程序在后台运行并安装CBT挂钩。每次应用程序创建一个窗口(HookProc代码= HCBT_CREATEWND)时,钩子都会根据包含路径和所需应用程序ID的地图检查应用程序的路径。如果找到匹配项,则设置HWND的应用程序ID。由于这是在实际显示窗口之前发生的并且与自定义任务列表结合,因此从用户的角度来看,应用程序的行为就像支持最近/固定文档列表的应用程序一样。