windows - SHAddToRecentDocs 没有文件?

标签 windows windows-7 taskbar windows-shell

我正在研究一个 IRC 客户端,将其与 Windows 7 应用栏集成。

要获取“频繁”或“最近”项目列表,必须调用 SHAddToRecentDocs API。 我想将最近访问的 IRC channel 添加到 IRC 应用程序的 Windows 7 跳转列表中。 现在,我的问题是,文件系统中不存在 IRC channel 。 SHAddToRecentDocs 似乎坚持获取某种文件系统对象。

我尝试通过创建一个指向我的应用程序的 IShellItem 并为其提供启动 channel 的命令行来解决此问题。然而 shell 正在反叛,到目前为止还没有明显地将我的任何“最近文档”尝试添加到跳转列表中。

有没有办法在不创建某种完全不需要的文件系统对象的情况下做到这一点?

最佳答案

question 1671793 答案中的代码走了一部分路。您需要一个 IShellLink 而不是 IShellItem。我一点一点地尝试了该代码。在使用 IPropertyStore 设置标题之前,一切都不起作用。 IPersistFile 代码似乎没有必要。

尽管如此,虽然现在当我右键单击应用程序的任务栏图标时会出现一些项目,但我还没有将它们作为我的应用程序的子菜单显示在开始菜单上(就像 word 文档那样) ,例如),所以我还不太满意。我认为这是 SHAddToRecentDocs 文档中警告的结果:

Executable (.exe) files are filtered from the recently used documents list in Windows XP and later versions. Although SHAddToRecentDocs will accept the path of an executable file, that file will not appear in the Recent Items list.

这是我的代码。我正在经历一些困难,因为我的开发环境使用的是较旧的 Windows SDK(所以我必须为自己创建 PKEY_Title),并且我的应用程序需要支持 Win2k(所以我不想绑定(bind)到像 InitPropVariantFromString 这样的函数 需要更新的 Windows 版本)。

HRESULT hr;
IShellLink* link;

// Get a pointer to the IShellLink interface.
hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&link);
if (FAILED(hr))
    return;
link->SetPath(path_to_app);
link->SetArguments(L"/some /args");
link->SetDescription(L"A description");  // Turns into tooltip

IPropertyStore* prop_store;
hr = link->QueryInterface(&prop_store);
if(SUCCEEDED(hr))
{
    PROPVARIANT pv;
    pv.vt=VT_LPWSTR;
    pv.pwszVal=L"Name of item"; // Turns into actual item name

    PROPERTYKEY PKEY_Title;
    CLSIDFromString(L"{F29F85E0-4FF9-1068-AB91-08002B27B3D9}", &(PKEY_Title.fmtid));
    PKEY_Title.pid=2;

    // Set the title property.
    hr = prop_store->SetValue(PKEY_Title, pv); // THIS is where the displayed title is actually set

    // Save the changes we made to the property store
    prop_store->Commit();
    prop_store->Release();
}

SHARDAPPIDINFOLINK appinfo;
appinfo.pszAppID=L"Company.AppName"; // Previously registered using SetCurrentProcessExplicitAppUserModelID
appinfo.psl=link;
SHAddToRecentDocs(SHARD_APPIDINFOLINK, &appinfo);
link->Release();

关于windows - SHAddToRecentDocs 没有文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2515185/

相关文章:

c++ - 如何使用 C++ 在后台跟踪剪贴板更改

delphi - OpenGL 中的奇怪行为

java - 应用程序图标不清晰

windows - 如何评估 Windows 环境变量?

c++ - 如何从 C++ 获取 Windows 上的驱动程序版本

windows - 我可以在 Windows 7 中查看过去一小时内在我的系统上打开了哪些文件的日志吗?

visual-studio - 如何在 Windows 7 任务栏中固定 Visual Studio 解决方案

java - 为什么 jframe 最大化时会隐藏任务栏?

c# - 更改 Win7 任务栏中显示的应用程序名称

c# - 当 requestedExecutionLevel 设置为 "requireAdministrator"时,windows 8 winform 不会自动启动