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

Winapi 是否可以通过编程方式将文件夹添加到资源管理器窗口中的Windows 10快速访问面板?,winapi,windows-10,Winapi,Windows 10,显然,微软已经(某种程度上)用快速访问项替换了“收藏夹”Windows资源管理器项。但我还没能找到一种通过编程向其中添加文件夹的方法(无论是在谷歌还是MSDN上)。还没有办法做到这一点吗?我在这里得到了一个答案: 显然,这还不可能,但这样一个API的提议已经提出。在微软发布API之前,它可能会帮助某些人。 我运行了procmon,似乎涉及到了这些注册表项 快速访问的Pin码: HKEY_CLASSES_ROOT\Folder\shell\pintohome shell:::{679F85CB

显然,微软已经(某种程度上)用快速访问项替换了“收藏夹”Windows资源管理器项。但我还没能找到一种通过编程向其中添加文件夹的方法(无论是在谷歌还是MSDN上)。还没有办法做到这一点吗?

我在这里得到了一个答案:


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

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

快速访问的Pin码:

HKEY_CLASSES_ROOT\Folder\shell\pintohome
shell:::{679F85CB-0220-4080-B29B-5540CC05AAB6}
解锁时:

HKEY_CLASSES_ROOT\PinnedFrequentPlace\shell\unpinfromhome\command
锁定时也会使用此资源:(EDIT1:再也找不到它了..)

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

EDIT2:我发现在“运行”中运行此选项可以打开快速访问:

HKEY_CLASSES_ROOT\Folder\shell\pintohome
shell:::{679F85CB-0220-4080-B29B-5540CC05AAB6}

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


希望有帮助。

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文件夹或东西快速访问

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

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

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


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

我能够在C语言中使用shell32,基于本文中的信息和本文中关于shell32的一些信息

您需要添加对“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");
    }
}

编辑:经过进一步调查,我发现快速访问包含两个“部分”。一个是固定项目,另一个是常用文件夹。由于某种原因,
音乐
视频
默认位于第二部分(至少在1909年),与其他部分(桌面/下载/文档/图片)不同因此,用于调用的动词从
unpformhome
更改为
removefromhome
(定义见
HKEY_CLASSES\u 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解决方案从快速访问中取消链接
音乐
视频
。与其他解决方案不同,这些链接似乎很特别,因为它们不包含“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。自动评估ms
,然后注销/重新启动以便重新创建。但我不知道它是否有副作用。批处理脚本:

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

我不知道答案,抱歉,但是。祝你好运。你不应该这样做。现在可以通过powershell更新已接受的答案。请参阅@YohanNey的答案:这是可行的,但你必须确保将
C:\My Folder
更改为系统上存在的位置。这适用于路径,但不适用于库。如果我将c:/my文件夹替换为“%appdata%\Microsoft\Windows\Libraries\myLibrary.library ms”,它将不起作用,有什么想法吗?作为另一个用户执行此操作有什么想法吗?(即ps远程处理)现在可以通过powershell执行此操作,请参阅@YohanNey的答案:
$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 => Frequent Folders
:: 5f7b5f1e01b83767 => Recent Files
rename "%APPDATA%\Microsoft\Windows\Recent\AutomaticDestinations\f01b4d95cf55d32a.automaticDestinations-ms" f01b4d95cf55d32a.automaticDestinations-ms.bak