1

我有一个用 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 固定到任务栏并右键单击它时,将出现 jumpilst 并且它包含所有添加的 IShellLinks。单击一个项目时,它将启动相应的进程。

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

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

问题:

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

1 回答 1

1

这里没有太多反应;]

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

于 2011-01-29T15:38:34.343 回答