是否可以以编程方式将文件夹添加到资源管理器窗口中的Windows 10快速访问面板?

时间:2015-05-05 11:23:14

标签: winapi windows-10

显然,微软已经(有点)取代了"收藏夹"带有快速访问项的Windows资源管理器项。但我还没有找到一种方法以编程方式向其中添加文件夹(在Google上都不是MSDN)。有没有办法做到这一点?

9 个答案:

答案 0 :(得分:10)

在powershell(至少)中有一种简单的方法:

$o = new-object -com shell.application
$o.Namespace('c:\My Folder').Self.InvokeVerb("pintohome")

希望它有所帮助。

答案 1 :(得分:5)

Yohan Ney关于固定项目的答案是正确的。要取消固定项目,您可以执行以下操作:

$QuickAccess = New-Object -ComObject shell.application 
($QuickAccess.Namespace("shell:::{679f85cb-0220-4080-b29b-5540cc05aab6}").Items() | where {$_.Path -eq "C:\Temp"}).InvokeVerb("unpinfromhome")

这是我写的一个脚本,使pin / unpin更容易一些:

https://gallery.technet.microsoft.com/Set-QuickAccess-117e9a89

答案 2 :(得分:4)

我在这里得到了答案:

Windows 10 - Programmatically use Quick Access

显然,它还不可能,但已经提出了这样一个API的建议。

答案 3 :(得分:4)

在MS发布API之前,它可能会对某人有所帮助。 我运行了procmon,似乎涉及这些注册表项

固定快速访问:

HKEY_CLASSES_ROOT\Folder\shell\pintohome

取消固定时:

HKEY_CLASSES_ROOT\PinnedFrequentPlace\shell\unpinfromhome\command

固定时也会使用此资源:( EDIT1 :不能再找到它了..)

AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations\{SOME_SORT_OF_GUID}.automaticDestinations-ms

您可以尝试使用7-zip打开它,其中有几个适合目的地的文件

EDIT2 :我发现在“运行”中运行此功能会打开快速访问权限:

shell:::{679F85CB-0220-4080-B29B-5540CC05AAB6}

答案 4 :(得分:2)

我喜欢约翰的回答,但我添加了一点,以免删除已经存在的一些项目。我偶然把它钉在那里我必须选择pin文件夹或其他东西才能快速访问。

$QuickAccess = New-Object -ComObject shell.application 
$okItems = @("Desktop","Downloads","Documents","Pictures","iCloud Photos","iCloud Drive","PhpstormProjects","Wallpapers 5","Videos", "Schedules for testing")
($QuickAccess.Namespace("shell:::{679f85cb-0220-4080-b29b-5540cc05aab6}").Items() | where {$_.name -notin $okItems}).InvokeVerb("unpinfromhome");

答案 5 :(得分:0)

void PinToHome(const std::wstring& folder)
{
    ShellExecute(0, L"pintohome", folder.c_str(), L"", L"", SW_HIDE);
}

这是容易的部分,仍然无法做一个unpinfromhome

答案 6 :(得分:0)

以其他人所说的为基础...这允许您删除所有固定的文件夹(而不仅仅是所有/最近的文件夹/项目):

$o = new-object -com shell.application
$($o.Namespace("shell:::{679f85cb-0220-4080-b29b-5540cc05aab6}").Items() | where { $_.IsFolder -eq "True" -and ($($_.Verbs() | Where-Object {$_.Name -in "Unpin from Quick access"}) -ne $null)}).InvokeVerb("unpinfromhome")

我需要这个,所以我可以快速备份/恢复快速访问链接列表。所以我把它放在我的脚本的顶部(删除所有固定的项目,然后脚本的其余部分重新添加它们。这确保顺序正确。

是的,我确信上面的代码有更好的语法。

答案 7 :(得分:0)

我能够根据这篇文章中的信息使用shell32在C#中使用这个帖子,以及来自这篇文章{shell}的一些信息https://stackoverflow.com/a/19035049

您需要添加对“Microsoft Shell控件和自动化”的引用。

这将添加一个链接

Type shellAppType = Type.GetTypeFromProgID("Shell.Application");
Object shell = Activator.CreateInstance(shellAppType);
Shell32.Folder2 f = (Shell32.Folder2)shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { "C:\\temp" });
f.Self.InvokeVerb("pintohome");

这将删除名称

的链接
Type shellAppType = Type.GetTypeFromProgID("Shell.Application");
Object shell = Activator.CreateInstance(shellAppType);
Shell32.Folder2 f2 = (Shell32.Folder2)shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { "shell:::{679f85cb-0220-4080-b29b-5540cc05aab6}" });
Console.WriteLine("item count: " + f2.Items().Count);
foreach (FolderItem fi in f2.Items())
{
    Console.WriteLine(fi.Name);
    if (fi.Name == "temp")
    {
        ((FolderItem)fi).InvokeVerb("unpinfromhome");
    }
}

答案 8 :(得分:0)

编辑:经过进一步调查,我意识到快速访问包含两个“部分”。一种是固定项目,另一种是常用文件夹。由于某些原因,MusicVideos默认出现在第二部分(至少在1909年),与其余部分不同(桌面/下载/文档/图片)。因此,用于调用的动词从unpinfromhome变为removefromhome(在HKEY_CLASSES_ROOT\FrequentPlace中定义,CLSID:{b918dbc4-162c-43e5-85bf-19059a776e9e})。在PowerShell中:

$Unpin = @("$env:USERPROFILE\Videos","$env:USERPROFILE\Music")
$qa = New-Object -ComObject shell.application
$ob = $qa.Namespace('shell:::{679f85cb-0220-4080-b29b-5540cc05aab6}').Items() | ? {$_.Path -in $Unpin}
$ob.InvokeVerb('removefromhome')

在Windows 1909中,无法使用建议的PowerShell解决方案从快速访问中取消锁定MusicVideos链接。似乎它们很特别,因为它们不像其他图标那样包含“ pin”图标。

解决方案是固定和取消固定它们。我对Windows API或PowerShell的了解不多,因此可能会有一种不太复杂的方法。

$Unpin = @("$env:USERPROFILE\Videos","$env:USERPROFILE\Music")
$qa = New-Object -ComObject shell.application
ForEach ($dir in $Unpin) { $qa.Namespace($dir).Self.InvokeVerb('pintohome') }
$ob = $qa.Namespace('shell:::{679f85cb-0220-4080-b29b-5540cc05aab6}').Items() | ? {$_.Path -in $Unpin}
$ob.InvokeVerb('unpinfromhome')

另一种方法是重命名f01b4d95cf55d32a.automaticDestinations-ms,然后注销/重新引导以便重新创建。但是我不知道它是否有副作用。批处理脚本:

:: f01b4d95cf55d32a => Frequent Folders
:: 5f7b5f1e01b83767 => Recent Files
rename "%APPDATA%\Microsoft\Windows\Recent\AutomaticDestinations\f01b4d95cf55d32a.automaticDestinations-ms" f01b4d95cf55d32a.automaticDestinations-ms.bak