在Windows 10中,以编程方式将文件夹固定/取消固定到快速访问菜单

7
我有一个用C#编写的桌面应用程序,该应用程序使用户能够在其计算机硬盘上创建文件夹。在Windows 7和8上,该应用程序会在Windows资源管理器窗口左侧的收藏夹菜单下创建此文件夹的快捷方式。
在Windows 10中,没有收藏夹菜单,它被快速访问菜单所取代。如果右键单击文件夹,则可以选择将其固定到快速访问菜单中。
为了从C#代码内部以编程方式执行此操作,我找到了一个.exe文件,可以像用户单击菜单项以固定文件夹一样执行Pin操作。我从这里获得了这个exe:http://www.maddogsw.com/cmdutils/ 问题是这个exe不包含取消固定文件夹的选项,因此除非我删除它,否则我将无法从快速访问菜单中删除快捷方式,而我不想这样做。
我试图找到快捷方式文件,并在此路径中找到它:%AppData%\Windows\Recent\AutomaticDestinations
但是,此文件快捷方式与文件本身之间没有映射。同时,当我从此路径中删除文件时,所有固定文件夹的快捷方式都会从快速访问中删除,而不仅仅是我的快捷方式。
有人能帮忙吗?
我需要知道是否有任何命令可以在命令提示符中使用它来将文件夹固定/取消固定到快速访问中吗?

2
小心!雷蒙德·陈可能会写一篇关于你的文章。https://blogs.msdn.microsoft.com/oldnewthing/20030903-00/?p=42673/ - Bradley Uffner
我在这篇帖子https://dev59.com/Z10a5IYBdhLWcg3wsKYK#50032421中发布了一个C# shell32解决方案。 - Toby Leduc
1个回答

8

我知道已经有一点晚了,但是我找到了一种方法,希望还可以帮到一些人。

正如Bradley Uffner所提到的那样,没有API可以避免这样的API被不断滥用。但是仍然有一种(相当丑陋的)方式可以做到!

虽然我不是PowerShell的专家,但我找到了一种使用PowerShell的方法:

# To add 'C:\path\to\folder' to quick access:
$qa = New-Object -ComObject shell.application
$qa.NameSpace('C:\path\to\folder').Self.InvokeVerb("pintohome")

# To remove 'C:\path\to\folder' from quick access:
($qa.Namespace("shell:::{679F85CB-0220-4080-B29B-5540CC05AAB6}").Items() | Where-Object { $_.Path -EQ 'C:\path\to\folder' }).InvokeVerb("unpinfromhome")

最终,我通过使用C#找到了解决方案:

using System.Management.Automation;
using System.Management.Automation.Runspaces

private static void AddFolderToQuickAccess(string pathToFolder)
{
    using (var runspace = RunspaceFactory.CreateRunspace())
    {
        runspace.Open();
        var ps = PowerShell.Create();
        var shellApplication =
            ps.AddCommand("New-Object").AddParameter("ComObject", "shell.application").Invoke();
        dynamic nameSpace = shellApplication.FirstOrDefault()?.Methods["NameSpace"].Invoke(pathToFolder);
        nameSpace?.Self.InvokeVerb("pintohome");
    }
}

private static void RemoveFolderFromQuickAccess(string pathToFolder)
{
    using (var runspace = RunspaceFactory.CreateRunspace())
    {
        runspace.Open();
        var ps = PowerShell.Create();
        var removeScript =
            $"((New-Object -ComObject shell.application).Namespace(\"shell:::{{679f85cb-0220-4080-b29b-5540cc05aab6}}\").Items() | Where-Object {{ $_.Path -EQ \"{pathToFolder}\" }}).InvokeVerb(\"unpinfromhome\")";

        ps.AddScript(removeScript);
        ps.Invoke();
    }
}

注意: 要使此操作生效,您需要添加对 System.Management.Automation 的引用,这可以很容易地通过NuGet获得。


1
这只适用于文件夹吗?它也可以用于文件吗? - Trevy Burgess
@TrevyBurgess 不行。您是否可以在快速访问菜单中固定或取消固定文件? - eitamal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接