2016-04-20 25 views
7

Tôi có ứng dụng dành cho máy tính để bàn được viết bằng C# và ứng dụng này cho phép người dùng tạo thư mục trên ổ cứng máy của họ. trên cửa sổ 7 và 8, Ứng dụng tạo lối tắt cho thư mục này trong menu Favorit ở phía bên trái của cửa sổ Windows Explorer.Lập trình Ghim UnPin thư mục từ menu truy cập nhanh trong cửa sổ 10

Trong cửa sổ 10 không có menu Ưa thích, nó được thay thế bằng menu Truy cập nhanh và nếu bạn nhấp chuột phải vào thư mục bạn có thể chọn Ghim thư mục để truy cập nhanh.

Để làm điều này lập trình từ bên trong C# mã, tôi tìm thấy một .exe có thể thực hiện thao tác Pin như nếu người dùng nhấp vào mục menu để ghim thư mục tôi đã nhận nó từ đây

Vấn đề exe này không chứa một tùy chọn để bỏ ghim thư mục khỏi truy cập nhanh vì vậy tôi sẽ không thể xóa lối tắt khỏi menu truy cập nhanh trừ khi tôi đã xóa nó và tôi không muốn làm điều đó.

Tôi cố gắng để tìm tập tin shortcut và tôi tìm thấy nó trong con đường này % AppData% \ Windows \ Recent \ AutomaticDestinations

nhưng không có ánh xạ giữa shortcut tập tin này và các tập tin riêng của mình. và đồng thời khi tôi xóa các tệp khỏi đường dẫn này, tất cả phím tắt của thư mục được ghim sẽ bị xóa khỏi truy cập nhanh không chỉ lối tắt của tôi.

bất kỳ ai cũng có thể trợ giúp điều này?

Tôi có cần phải biết liệu có bất kỳ lệnh nào mà tôi có thể sử dụng nó để ghim thư mục \ Unpin để truy cập nhanh từ dấu nhắc lệnh không?

+2

Hãy cẩn thận! Raymond Chen có thể viết một bài báo về bạn. https://blogs.msdn.microsoft.com/oldnewthing/20030903-00/?p=42673/ –

Trả lời

1

Tôi biết đã muộn một chút, nhưng tôi đã tìm được cách để làm điều đó và nghĩ có thể ai đó vẫn có thể sử dụng nó.

Vì vậy, như đã được đề cập bởi Bradley Uffner, không có API nào để tránh việc lạm dụng liên tục các API như vậy. Nhưng vẫn còn một cách (khá xấu xí) để làm điều đó!

Tôi không phải chuyên gia trong PowerShell, nhưng tôi tìm thấy một cách để làm điều đó bằng 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") 

Mà cuối cùng dẫn tôi đến các giải pháp sử dụng 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(); 
    } 
} 

LƯU Ý: Để làm việc này, bạn cần phải thêm tham chiếu đến System.Management.Automation có thể dễ dàng lấy được dưới dạng nuget.

Các vấn đề liên quan