2016-04-20 1 views
7

J'ai une application de bureau écrit en C#, et cette application permet aux utilisateurs de créer le dossier sur leur machine disque dur. sur Windows 7 et 8, l'application crée un raccourci pour ce dossier sous le menu Favorit sur le côté gauche de la fenêtre de l'Explorateur Windows.Programatically Pin le dossier de ne plus distinguer le menu d'accès rapide dans les fenêtres 10

Dans Windows 10, il n'y a pas de menu Favoris, il a été remplacé par le menu Accès rapide, et si vous faites un clic droit sur le dossier, vous pouvez choisir de dossier Pin pour un accès rapide.

Pour ce faire par programme à l'intérieur du code C#, j'ai trouvé un .exe qui peut exécuter l'action de Pin comme si l'utilisateur a cliqué sur l'élément de menu pour épingler le dossier je l'ai d'ici

Le problème est ce exe ne contient pas une option pour Détacher le dossier d'un accès rapide donc je ne vais pas être en mesure de supprimer le raccourci dans le menu d'accès rapide à moins que si je l'ai effacé et je ne veux pas faire cela.

J'ai essayé de trouver le fichier de raccourci et je l'ai trouvé dans ce chemin % AppData% \ Windows \ \ AutomaticDestinations récents

, mais il n'y a pas de correspondance entre ce raccourci et le fichier lui-même. et en même temps quand je supprime les fichiers de ce chemin, tous les dossiers épinglés raccourci supprimer de l'accès rapide non seulement mon raccourci.

quelqu'un peut aider dans ce ??

Ai-je besoin de savoir s'il y a une commande que je peux l'utiliser pour les dossiers Pin \ pour accéder rapidement Annuler l'épinglage de l'invite de commande?

+2

Attention! Raymond Chen pourrait écrire un article sur vous. https://blogs.msdn.microsoft.com/oldnewthing/20030903-00/?p=42673/ –

Répondre

1

Je sais qu'il est un peu tard, mais j'ai trouvé un moyen de le faire et j'ai pensé que peut-être quelqu'un pourrait encore l'utiliser.

Ainsi, comme cela a été mentionné par Bradley Uffner, il n'y a pas d'API pour cela pour éviter l'abus constant de ces API. Mais il y a encore un moyen (plutôt moche) de le faire!

Je ne suis pas expert en PowerShell, mais je trouve un moyen de le faire en utilisant 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") 

Ce qui m'a finalement conduit à la solution en utilisant 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(); 
    } 
} 

REMARQUE: Pour que cela fonctionne, vous devez ajouter une référence à System.Management.Automation qui peut facilement être obtenue comme nuget.