2016-04-20 7 views
7

私はデスクトップアプリケーションをc#で作成しています。このアプリケーションを使用すると、コンピュータのハードドライブにフォルダを作成できます。 Windows 7と8では、アプリケーションは、このエクスプローラウィンドウの左側にある[お気に入り]メニューの下にこのフォルダのショートカットを作成します。プログラムでWindowsのクイックアクセスメニューからフォルダをアンパインする10

ウィンドウ10にはお気に入りメニューがありませんでした。クイックアクセスメニューに置き換えられました。フォルダを右クリックすると、すぐにアクセスできるようにピンフォルダを選択できます。ユーザーがフォルダ ピンにメニュー項目をクリックしたかのように、C#コード内からプログラム的にこれを行うには

は、私がここに

問題からそれを得たピンアクションを実行することができます.exeファイルを見つけました私はそれを削除し、私はそれをしたくない場合を除き、私はクイックアクセスメニューからショートカットを削除することはできませんので、このEXEには、クイックアクセスからフォルダをピンを解除するためのオプションが含まれていないですか?

私は、ショートカットファイルを見つけることを試みたと私は、このパスでそれを見つけた %APPDATA%\ WINDOWS \最近の\ AutomaticDestinations

をこのファイルのショートカットとファイル自体の間にマッピングがありません。このパスからファイルを削除すると同時に、すべての固定フォルダショートカットがショートカットだけでなくクイックアクセスから削除されます。

誰でもこれを手伝うことができますか?

Pin \ Unpinフォルダにコマンドプロンプトからすぐにアクセスできるコマンドがあるかどうかを知る必要がありますか?

+2

注意してください! Raymond Chenはあなたについての記事を書くかもしれません。 https://blogs.msdn.microsoft.com/oldnewthing/20030903-00/?p=42673/ –

答えて

1

私はそれが少し遅いと知っていますが、私はそれを行う方法を見つけて、誰かがまだこれを使用できるかもしれないと考えました。

Bradley Uffnerに言及されているように、このようなAPIの不当な使用を避けるためのAPIはありません。しかし、それを行うにはまだ(醜い)方法があります!

私はPowerShellで何の専門家だが、私はPowerShellを使用してそれを行うための方法を見つけた:

最後にC#を使用してソリューションに私を導いた
# 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") 

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(); 
    } 
} 

注:これが機能するには、​​への参照を追加する必要があります。これは簡単にnugetとして取得できます。

関連する問題