3

我正在尝试将我们的应用程序与 Windows 7 跳转列表正确集成。我们允许在应用程序中打开文件,我不久前添加了这个以将项目添加到跳转列表中:

var list = JumpList.CreateJumpList()
list.AddToRecent(file);
list.Refresh();

其中 JumpList 来自WindowsAPICodePack

这种方法有两个问题。

  1. 有时,用户会在 Refresh() 调用上收到 ComException(无法删除要替换的文件。(来自 HRESULT 的异常:0x80070497))。
  2. JumpList 将仅包含具有应用程序文件扩展名的文件。

我们允许通过 Open 方法在我们的应用程序中导入其他文件,我希望这些文件也显示在跳转列表中,但它们没有。

我在 SO 上搜索了有关 JumpLists 的问题,并找到了一种在此答案中添加最近使用的文件的不同方法:

    void AddFileToRecentFilesList(string fileName)
    {
        SHAddToRecentDocs((uint)ShellAddRecentDocs.SHARD_PATHW, fileName);          
    }

    /// <summary>
    /// Native call to add the file to windows' recent file list
    /// </summary>
    /// <param name="uFlags">Always use (uint)ShellAddRecentDocs.SHARD_PATHW</param>
    /// <param name="pv">path to file</param>
    [DllImport("shell32.dll")]
    public static extern void SHAddToRecentDocs(UInt32 uFlags,
        [MarshalAs(UnmanagedType.LPWStr)] String pv);

    enum ShellAddRecentDocs
    {
        SHARD_PIDL = 0x00000001,
        SHARD_PATHA = 0x00000002,
        SHARD_PATHW = 0x00000003
    }

这似乎更合适,因为它也向后兼容 XP、Vista - 问题是 JumpList 仍然只包含具有我关联文件扩展名的文件。

我有两个问题:

  1. 将项目添加到跳转列表的更好方法是什么。
  2. 无论文件扩展名如何,如何让任何文件显示在我的跳转列表中?
4

1 回答 1

4

来自MSDN

应用程序必须是文件类型的注册处理程序,该类型的项目才能出现在其跳转列表中。但是,它不需要是该文件类型的默认处理程序

因此,您必须在您关心的每个文件类型中添加自己注册,方法是向 ProgId 添加动词,或者可能只是将您的 ProgId 或 exe 名称添加到 OpenWithProgIds 或 OpenWithList (HKCR\%.ext%\OpenWithProgIds)

windows需要这个的事实有点愚蠢,恕我直言,但我想他们需要知道当您单击跳转列表项时如何将文件路径传递给您的应用程序。

SHAddToRecentDocs 的参数类型比您列出的要多,SHARDAPPIDINFOLINK的文档没有说明您是否需要在任何地方注册才能使其工作,因此您可以尝试而不是添加基本路径...

于 2011-03-28T04:20:42.590 回答