我有一个用 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”开头,后跟中文字符。悬停跳转列表中的项目也显示汉字而不是我设置的描述。
问题:
- 跳转列表中的汉字是怎么回事?
- 为什么在任务栏快捷方式上设置应用程序 ID 会在“任务”和“最近”部分之间切换,为什么它们不都存在?
- 如果可能的话,实现我真正想要的方法是什么:一个自定义跳转列表,其中启动的项目将分组在它的任务栏图标下?(请注意,我计划启动的进程当前没有设置他们的应用程序 ID)