为什么只有带有我的文件扩展名的文件出现在Windows 7跳转列表中?

问题描述:

我想正确整合我们的应用程序与Windows 7跳转列表。我们允许应用程序中打开文件和我说这个前一阵子到项添加到跳转列表:为什么只有带有我的文件扩展名的文件出现在Windows 7跳转列表中?

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

其中的JumpList是从WindowsAPICodePack

有这种方法的两个问题。

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

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

我搜索通过这里的SO关于跳转列表的问题,并发现了一个不同的方式在这个answer添加最近使用的文件:

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的向后兼容 - 问题是跳转列表仍然只包含具有相关文件扩展名的文件。

我有两个问题:

  1. 有什么更好的方式将项目添加到跳转列表。
  2. 无论文件扩展名为何,我如何获取任何文件以显示在我的跳转列表中?
+0

的Code Pack的源代码可以免费使用。如果你看JumpList类中的AddToRecent,你会发现它只是用PATHW和你传入的路径调用SHAddToRecentDocs。所以你的两种做法没有区别。 – 2011-03-28 11:12:55

+0

好点。谢谢凯特。应该检查我自己。 – 2011-03-28 23:31:46

MSDN

的应用程序必须是注册 处理程序为 该类型的项目的文件类型出现在其跳转列表。 这不,但是,需要对这份文件类型

的 默认处理所以你必须添加自己注册的每对文件类型你计较,通过添加一个动词的ProgID或可能只是增加你的ProgId或exe名称为OpenWithProgIds或OpenWithList(HKCR \%。ext%\ OpenWithProgIds)

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

SHAddToRecentDocs比您列出,为SHARDAPPIDINFOLINK的文档,如果您需要在任何地方注册为它工作,所以你可以尝试,而不是增加一个基本路径,不说多参数类型...

+0

谢谢。优秀的回答:) – 2011-03-28 04:22:34