2016-04-20 14 views
7

Ich habe eine Desktop-Anwendung in C# geschrieben, und diese Anwendung ermöglicht es Benutzern, den Ordner auf ihrer Maschine Festplatte zu erstellen. Unter Windows 7 und 8 erstellt die App eine Verknüpfung für diesen Ordner im Favoriten-Menü auf der linken Seite des Windows Explorer-Fensters.Programmatisch Pin UnPin den Ordner aus dem Schnellzugriffsmenü in Windows 10

In Windows 10 gibt es kein Favoritenmenü, es wurde durch Schnellzugriffsmenü ersetzt, und wenn Sie mit der rechten Maustaste auf den Ordner klicken, können Sie den Ordner Pin für den schnellen Zugriff auswählen.

diese von innen C# -Code programmatisch zu tun, fand ich eine Exe, die die Pin Aktion als ob der Benutzer klickte auf den Menüpunkt ausführen kann den Ordner, um ihn an Pin ich von hier

Das Problem Ist diese exe nicht enthalten eine Option zum Entfernen des Ordners vom Schnellzugriff, so dass ich nicht in der Lage sein werde, die Verknüpfung aus dem Schnellzugriffsmenü zu entfernen, es sei denn, wenn ich es gelöscht habe und ich will das nicht tun.

Ich habe versucht, die Verknüpfungsdatei zu finden und ich es in diesem Pfad gefunden % AppData% \ Windows \ Recent \ AutomaticDestinations

aber es gibt keine Zuordnung zwischen dieser Datei Verknüpfung und der Datei selbst. und zur gleichen Zeit, wenn ich die Dateien aus diesem Pfad lösche, löschen alle Pinged Ordner Verknüpfung aus dem Schnellzugriff nicht nur meine Verknüpfung.

kann jemand dabei helfen ??

Muss ich wissen, ob es einen Befehl gibt, den ich verwenden kann, um Pin \ Unpin-Ordner für den schnellen Zugriff von der Eingabeaufforderung aus zu verwenden?

+2

Seien Sie vorsichtig! Raymond Chen könnte einen Artikel über dich schreiben. https://blogs.msdn.microsoft.com/oldnewthing/20030903-00/?p=42673/ –

Antwort

1

Ich weiß, es ist ein bisschen spät, aber ich habe einen Weg gefunden, es zu tun und dachte, dass vielleicht noch jemand das benutzen könnte.

Also, wie von Bradley Uffner erwähnt wurde, gibt es keine API dafür, um den ständigen Missbrauch solcher APIs zu vermeiden. Aber es gibt immer noch einen (ziemlich hässlichen) Weg, es zu tun!

Ich bin kein Experte in Powershell, aber ich habe einen Weg gefunden, es zu tun Powershell mit:

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

die schließlich zur Lösung führte mich mit 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(); 
    } 
} 

HINWEIS: Damit dies funktioniert, müssen Sie einen Verweis auf System.Management.Automation hinzufügen, der leicht als nuget abgerufen werden kann.