以编程方式Pin \ UnPin从Windows 10中的快速访问菜单中的文件夹

时间:2016-04-20 09:23:40

标签: c# winforms windows-10 shortcuts

我有一个用c#编写的桌面应用程序,该应用程序使用户可以在其计算机硬盘上创建该文件夹。在Windows 7和8上,该应用程序在Windows资源管理器窗口左侧的“收藏夹”菜单下为该文件夹创建了一个快捷方式。

在Windows 10中没有收藏夹菜单,它被快速访问菜单取代,如果您右键单击该文件夹,您可以选择固定文件夹以便快速访问。

要从c#代码中以编程方式执行此操作,我找到了一个可以执行Pin操作的.exe,就像用户单击菜单项来固定文件夹一样 我从这里得到了http://www.maddogsw.com/cmdutils/

问题是这个exe不包含从快速访问取消固定文件夹的选项,所以我将无法从快速访问菜单中删除快捷方式,除非我删除它并且我不想这样做。

我试图找到快捷方式文件,并在此路径中找到了它 %AppData%\ Windows \ Recent \ AutomaticDestinations

但此文件快捷方式与文件本身之间没有映射。并且在我从此路径中删除文件的同时,所有固定文件夹快捷方式都从快速访问中删除,而不仅仅是我的快捷方式。

任何人都可以帮忙吗?

我是否需要知道是否有任何命令可以将它用于Pin \ Unpin文件夹以便从命令提示符快速访问?

1 个答案:

答案 0 :(得分:1)

我知道它有点晚了,但我找到了办法,并认为也许有人仍然可以使用它。

正如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