繁体   English   中英

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

[英]Programatically Pin\UnPin the folder from quick access menu in windows 10

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

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

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

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

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

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

有人可以帮忙吗?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM