Lai*_*ila 8 c# shortcuts winforms windows-10
我有一个用c#编写的桌面应用程序,这个应用程序使用户可以在他们的机器硬盘上创建文件夹.在Windows 7和8上,该应用程序在Windows资源管理器窗口左侧的"收藏夹"菜单下为该文件夹创建了一个快捷方式.
在Windows 10中没有收藏菜单,它被快速访问菜单取代,如果您右键单击该文件夹,您可以选择固定文件夹以便快速访问.
为了以编程方式从c#代码中执行此操作,我找到了一个可以执行Pin操作的.exe,好像用户点击了菜单项来固定我从这里获得的文件夹 http://www.maddogsw.com/cmdutils/
问题是这个exe不包含从快速访问取消固定文件夹的选项,所以我将无法从快速访问菜单中删除快捷方式,除非我删除它并且我不想这样做.
我试图找到快捷方式文件,我在这个路径%AppData%\ Windows\Recent\AutomaticDestinations中找到了它
但是此文件快捷方式与文件本身之间没有映射.并且在我从此路径中删除文件的同时,所有固定文件夹快捷方式快捷方式删除快捷访问不仅仅是我的快捷方式.
有人可以帮忙吗?
我是否需要知道是否有任何命令可以将其用于Pin\Unpin文件夹以从命令提示符快速访问?
小智 5
我知道这有点晚了,但我找到了一种方法,并认为也许有人仍然可以使用它。
因此,正如 Bradley Uffner 所提到的,没有用于此的 API 来避免此类 API 的不断滥用。但是仍然有一种(相当丑陋的)方法来做到这一点!
我不是 PowerShell 专家,但我找到了一种使用 PowerShell 的方法:
# To add 'C:\path\to\folder' to quick access:
$qa = New-Object -ComObject shell.application
$qa.NameSpace('C:\path\to\folder').Self.InvokeVerb("pintohome")
# To remove 'C:\path\to\folder' from quick access:
($qa.Namespace("shell:::{679F85CB-0220-4080-B29B-5540CC05AAB6}").Items() | Where-Object { $_.Path -EQ 'C:\path\to\folder' }).InvokeVerb("unpinfromhome")
Run Code Online (Sandbox Code Playgroud)
这最终使我找到了使用 C# 的解决方案:
using System.Management.Automation;
using System.Management.Automation.Runspaces
private static void AddFolderToQuickAccess(string pathToFolder)
{
using (var runspace = RunspaceFactory.CreateRunspace())
{
runspace.Open();
var ps = PowerShell.Create();
var shellApplication =
ps.AddCommand("New-Object").AddParameter("ComObject", "shell.application").Invoke();
dynamic nameSpace = shellApplication.FirstOrDefault()?.Methods["NameSpace"].Invoke(pathToFolder);
nameSpace?.Self.InvokeVerb("pintohome");
}
}
private static void RemoveFolderFromQuickAccess(string pathToFolder)
{
using (var runspace = RunspaceFactory.CreateRunspace())
{
runspace.Open();
var ps = PowerShell.Create();
var removeScript =
$"((New-Object -ComObject shell.application).Namespace(\"shell:::{{679f85cb-0220-4080-b29b-5540cc05aab6}}\").Items() | Where-Object {{ $_.Path -EQ \"{pathToFolder}\" }}).InvokeVerb(\"unpinfromhome\")";
ps.AddScript(removeScript);
ps.Invoke();
}
}
Run Code Online (Sandbox Code Playgroud)
注意:要使其正常工作,您需要添加一个System.Management.Automation可以轻松获取为nuget 的引用。