2016-04-20 18 views
7

Ho un'applicazione desktop scritta in C# e questa applicazione consente agli utenti di creare la cartella sul proprio disco fisso. su Windows 7 e 8, l'App crea una scorciatoia per questa cartella sotto il menu Favorito sul lato sinistro della finestra di Windows Explorer.Programmare Pin UnPin dalla cartella dal menu di accesso rapido in windows 10

In Windows 10 non è presente il menu Preferiti, è stato sostituito dal menu di accesso rapido e, se si fa clic con il pulsante destro sulla cartella, è possibile scegliere di bloccare la cartella per l'accesso rapido.

Per fare questo a livello di codice da dentro codice C#, ho trovato un exe in grado di eseguire l'azione Pin come se l'utente fa clic sulla voce di menu al pin cartella ho presa da qui

Il problema questo exe non contiene un'opzione per Sbloccare la cartella dall'accesso rapido, quindi non sarò in grado di rimuovere il collegamento dal menu di accesso rapido a meno che non lo abbia eliminato e non voglio farlo.

ho cercato di trovare il file di collegamento e l'ho trovato in questo percorso % AppData% \ Windows \ Recent \ AutomaticDestinations

, ma non v'è alcuna associazione tra questo file di collegamento e il file stesso. e allo stesso tempo quando elimino i file da questo percorso, tutte le scorciatoie delle cartelle Pinned eliminano dall'accesso rapido non solo il mio collegamento.

chiunque può aiutare in questo ??

Devo sapere se esiste un comando che posso utilizzare per bloccare \ Unpin le cartelle per l'accesso rapido dal prompt dei comandi?

+2

Attenzione! Raymond Chen potrebbe scrivere un articolo su di te. https://blogs.msdn.microsoft.com/oldnewthing/20030903-00/?p=42673/ –

risposta

1

So che è un po 'tardi, ma ho trovato un modo per farlo e ho pensato che qualcuno potrebbe ancora usarlo.

Così come è stato menzionato da Bradley Uffner, non esiste alcuna API per evitare il costante abuso di tali API. Ma c'è ancora un (piuttosto brutto) modo di farlo!

Non sono un esperto in PowerShell, ma ho trovato un modo per farlo utilizzando 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") 

che alla fine mi ha portato alla soluzione utilizzando 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(); 
    } 
} 

NOTA: Affinché funzioni, è necessario aggiungere un riferimento a System.Management.Automation che può essere facilmente ottenuto come nuget.