Возможно ли программно добавить папки на панель быстрого доступа Windows 10 в окне проводника?

По-видимому, Microsoft (вроде) заменила элемент "Избранное" Windows Explorer элементом быстрого доступа. Но я не смог найти способ программно добавлять туда папки (ни на Google, ни на MSDN). Нет ли способа сделать это еще?

Ответ 2

Существует простой способ сделать это в powershell (по крайней мере):

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

Надеюсь, что это поможет.

Ответ 3

Возможно, это поможет кому-то, пока MS не выпустит API. Я запускал procmon, и кажется, что эти ключи реестра задействованы

Контакт для быстрого доступа:

HKEY_CLASSES_ROOT\Folder\shell\pintohome

Когда unpin:

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

Ответ Yohan Ney для закрепления элемента правильный. Чтобы разблокировать элемент, вы можете сделать это:

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

Здесь script я написал, чтобы сделать pin/unpin немного проще:

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

Ответ 5

Мне нравится ответ Йохана, но я добавил немного, чтобы не удалить некоторые элементы, которые уже были там. У меня была тонна, приколотая туда случайно, я, должно быть, выбрал папку с булавкой или что-то в виду для быстрого доступа.

$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");

Ответ 6

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

что было легкой частью, все еще неспособной сделать uninfromhome

Ответ 7

Основываясь на том, что говорили другие... Это позволяет удалить все закрепленные папки (не только все/последние папки/элементы):

$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")

Я нуждался в этом, чтобы быстро создать резервную копию списка быстрых ссылок. Поэтому я помещал это в начало моего скрипта (чтобы удалить все закрепленные элементы, тогда остальная часть скрипта повторно добавляет их. Это гарантирует, что порядок верен.

И да, я уверен, что для приведенного выше кода лучше синтаксис.

Ответ 8

Я смог заставить это работать на С#, используя shell32, на основе информации в этом сообщении и некоторой информации о shell32 из этого сообщения fooobar.com/info/67921/...

Вам нужно добавить ссылку на "Microsoft Shell Controls and Automation".

Это добавит ссылку

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");
    }
}