2016-04-20 8 views
7

Mam aplikację napisaną w języku C#, a ta aplikacja umożliwia użytkownikom tworzenie folderów na ich dyskach twardych. w Windows 7 i 8 aplikacja tworzy skrót do tego folderu w menu Favorit po lewej stronie okna Eksploratora Windows.Programowo przypnij Odepnij folder z menu szybkiego dostępu w oknach 10

W systemie Windows 10 nie ma menu Ulubione, zostało zastąpione przez menu Szybki dostęp, a jeśli klikniesz prawym przyciskiem myszy na folderze, możesz wybrać folder Przypnij, aby uzyskać szybki dostęp.

Aby to zrobić programowo od wewnątrz C# kodu, znalazłem .exe, który może wykonać akcję Pin jakby użytkownik kliknął pozycję menu przypiąć folder mam go stąd

Problem czy ten plik exe nie zawiera opcji Odepnij folder z szybkiego dostępu, więc nie będę mógł usunąć skrótu z menu szybkiego dostępu, chyba że usunę go i nie będę tego robić.

Próbowałem znaleźć plik skrótu i ​​znalazłem go w tej ścieżce % AppData% \ Windows \ Recent \ AutomaticDestinations

ale nie ma odwzorowania między tym pliku skrótu i ​​samego pliku. iw tym samym czasie, gdy usuwam pliki z tej ścieżki, wszystkie skróty do folderów przypiętych usuwają z szybkiego dostępu nie tylko mojego skrótu.

ktoś może w tym pomóc?

Czy muszę wiedzieć, czy istnieje jakieś polecenie, które można użyć do przypinania/odpinania folderów do szybkiego dostępu z wiersza polecenia?

+2

Należy zachować ostrożność! Raymond Chen może napisać o tobie artykuł. https://blogs.msdn.microsoft.com/oldnewthing/20030903-00/?p=42673/ –

Odpowiedz

1

Wiem, że jest trochę za późno, ale znalazłem sposób na zrobienie tego i pomyślałem, że może ktoś może nadal z niego korzystać.

Tak jak wspomniał Bradley Uffner, nie ma na to API, aby uniknąć ciągłego nadużywania takich API. Ale nadal istnieje (raczej brzydki) sposób na zrobienie tego!

nie jestem ekspertem w PowerShell, ale znalazłem sposób to zrobić przy użyciu 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") 

która ostatecznie doprowadziła mnie do rozwiązania za pomocą 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(); 
    } 
} 

UWAGA: Aby to działało, musisz dodać odniesienie do System.Management.Automation, które można łatwo uzyskać jako nuget.

Powiązane problemy