是否可以通过编程方式将文件夹添加到资源管理器 window 中的 Windows 10 快速访问面板?
Is it possible programmatically add folders to the Windows 10 Quick Access panel in the explorer window?
显然,Microsoft 已经(在某种程度上)用快速访问项替换了 "Favorites" Windows 资源管理器项。但是我一直没能找到以编程方式向其中添加文件夹的方法(在 Google 和 MSDN 上都没有)。还没有办法做到这一点吗?
我在这里得到了答案:
Windows 10 - Programmatically use Quick Access
显然,这还不可能,但是已经提出了这样一个 API 的提议。
也许在 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:我在 'Run' 中找到了 运行 快速访问:
shell:::{679F85CB-0220-4080-B29B-5540CC05AAB6}
在 powershell 中有一个简单的方法(至少):
$o = new-object -com shell.application
$o.Namespace('c:\My Folder').Self.InvokeVerb("pintohome")
希望对您有所帮助。
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
void PinToHome(const std::wstring& folder)
{
ShellExecute(0, L"pintohome", folder.c_str(), L"", L"", SW_HIDE);
}
这是最简单的部分,仍然无法从主页上取消固定
我喜欢 Johan 的回答,但我添加了一些内容以确保不删除其中已有的一些项目。我不小心把很多东西固定在那里,我必须选择固定文件夹或其他东西才能快速访问。
$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");
根据其他人所说的...这允许您删除所有 固定 文件夹(不仅仅是 all/recent folders/items):
$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")
我需要这个,这样我就可以快速备份/恢复我的快速访问链接列表。所以我把它放在我的脚本的顶部(删除所有固定的项目,然后脚本的其余部分 re-adds 它们。这确保顺序是正确的。
是的,我确定上面的代码有更好的语法。
我能够根据此 post 中的信息和此 post
中有关 shell32 的一些信息,使用 shell32 使其在 C# 中运行
您需要添加对 "Microsoft Shell Controls and Automation" 的引用。
这将添加一个 link
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");
这将按名称
删除 link
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");
}
}
编辑:经过进一步调查,我发现快速访问包含两个“部分”。一个是固定项目,另一个是常用文件夹。出于某种原因,Music
和 Videos
默认出现在第二部分(至少在 1909 年),与其余部分 (Desktop/Downloads/Documents/Pictures) 不同。因此调用的动词从 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 解决方案从快速访问中取消固定 Music
或 Videos
链接。看起来它们很特别,因为它们不像其他图标那样包含“图钉”图标。
解决方法是固定和取消固定它们。我不太了解 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
,然后记录 off/rebooting 以便重新创建它。但是不知道有没有副作用。批处理脚本:
:: f01b4d95cf55d32a => Frequent Folders
:: 5f7b5f1e01b83767 => Recent Files
rename "%APPDATA%\Microsoft\Windows\Recent\AutomaticDestinations\f01b4d95cf55d32a.automaticDestinations-ms" f01b4d95cf55d32a.automaticDestinations-ms.bak
对于那些使用 .NET Core 的人:
遗憾的是,您不能在构建过程中包含对“Microsoft Shell 控制和自动化”的引用。
但您可以改为使用动态,并省略引用:
public static void PinToQuickAccess(string folder)
{
// You need to include "Microsoft Shell Controls and Automation" reference
// Cannot include reference in .NET Core
System.Type shellAppType = System.Type.GetTypeFromProgID("Shell.Application");
object shell = System.Activator.CreateInstance(shellAppType);
// Shell32.Folder2 f = (Shell32.Folder2)shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { folder });
dynamic f = shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { folder });
f.Self.InvokeVerb("pintohome");
}
并取消固定:
public static void UnpinFromQuickAccess(string folder)
{
// You need to include "Microsoft Shell Controls and Automation" reference
System.Type shellAppType = System.Type.GetTypeFromProgID("Shell.Application");
object shell = System.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}" });
dynamic f2 = shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { "shell:::{679f85cb-0220-4080-b29b-5540cc05aab6}" });
foreach (dynamic fi in f2.Items())
{
if (string.Equals(fi.Path, folder))
{
fi.InvokeVerb("unpinfromhome");
}
}
}
显然,Microsoft 已经(在某种程度上)用快速访问项替换了 "Favorites" Windows 资源管理器项。但是我一直没能找到以编程方式向其中添加文件夹的方法(在 Google 和 MSDN 上都没有)。还没有办法做到这一点吗?
我在这里得到了答案:
Windows 10 - Programmatically use Quick Access
显然,这还不可能,但是已经提出了这样一个 API 的提议。
也许在 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:我在 'Run' 中找到了 运行 快速访问:
shell:::{679F85CB-0220-4080-B29B-5540CC05AAB6}
在 powershell 中有一个简单的方法(至少):
$o = new-object -com shell.application
$o.Namespace('c:\My Folder').Self.InvokeVerb("pintohome")
希望对您有所帮助。
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
void PinToHome(const std::wstring& folder)
{
ShellExecute(0, L"pintohome", folder.c_str(), L"", L"", SW_HIDE);
}
这是最简单的部分,仍然无法从主页上取消固定
我喜欢 Johan 的回答,但我添加了一些内容以确保不删除其中已有的一些项目。我不小心把很多东西固定在那里,我必须选择固定文件夹或其他东西才能快速访问。
$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");
根据其他人所说的...这允许您删除所有 固定 文件夹(不仅仅是 all/recent folders/items):
$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")
我需要这个,这样我就可以快速备份/恢复我的快速访问链接列表。所以我把它放在我的脚本的顶部(删除所有固定的项目,然后脚本的其余部分 re-adds 它们。这确保顺序是正确的。
是的,我确定上面的代码有更好的语法。
我能够根据此 post 中的信息和此 post
中有关 shell32 的一些信息,使用 shell32 使其在 C# 中运行您需要添加对 "Microsoft Shell Controls and Automation" 的引用。
这将添加一个 link
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");
这将按名称
删除 linkType 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");
}
}
编辑:经过进一步调查,我发现快速访问包含两个“部分”。一个是固定项目,另一个是常用文件夹。出于某种原因,Music
和 Videos
默认出现在第二部分(至少在 1909 年),与其余部分 (Desktop/Downloads/Documents/Pictures) 不同。因此调用的动词从 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 解决方案从快速访问中取消固定 Music
或 Videos
链接。看起来它们很特别,因为它们不像其他图标那样包含“图钉”图标。
解决方法是固定和取消固定它们。我不太了解 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
,然后记录 off/rebooting 以便重新创建它。但是不知道有没有副作用。批处理脚本:
:: f01b4d95cf55d32a => Frequent Folders
:: 5f7b5f1e01b83767 => Recent Files
rename "%APPDATA%\Microsoft\Windows\Recent\AutomaticDestinations\f01b4d95cf55d32a.automaticDestinations-ms" f01b4d95cf55d32a.automaticDestinations-ms.bak
对于那些使用 .NET Core 的人:
遗憾的是,您不能在构建过程中包含对“Microsoft Shell 控制和自动化”的引用。
但您可以改为使用动态,并省略引用:
public static void PinToQuickAccess(string folder)
{
// You need to include "Microsoft Shell Controls and Automation" reference
// Cannot include reference in .NET Core
System.Type shellAppType = System.Type.GetTypeFromProgID("Shell.Application");
object shell = System.Activator.CreateInstance(shellAppType);
// Shell32.Folder2 f = (Shell32.Folder2)shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { folder });
dynamic f = shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { folder });
f.Self.InvokeVerb("pintohome");
}
并取消固定:
public static void UnpinFromQuickAccess(string folder)
{
// You need to include "Microsoft Shell Controls and Automation" reference
System.Type shellAppType = System.Type.GetTypeFromProgID("Shell.Application");
object shell = System.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}" });
dynamic f2 = shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { "shell:::{679f85cb-0220-4080-b29b-5540cc05aab6}" });
foreach (dynamic fi in f2.Items())
{
if (string.Equals(fi.Path, folder))
{
fi.InvokeVerb("unpinfromhome");
}
}
}