По-видимому, Microsoft (вроде) заменила элемент "Избранное" Windows Explorer элементом быстрого доступа. Но я не смог найти способ программно добавлять туда папки (ни на Google, ни на MSDN). Нет ли способа сделать это еще?
Возможно ли программно добавить папки на панель быстрого доступа Windows 10 в окне проводника?
Ответ 1
Я получил ответ здесь:
Windows 10 - Программно использовать быстрый доступ
По-видимому, это пока невозможно, но было сделано предложение для такого API.
Ответ 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");
}
}