2011-07-13 28 views
8

Tôi muốn nhận đường dẫn đến các chương trình được liên kết với phần mở rộng tệp, tốt hơn là thông qua API Win32.Cách nhận các chương trình được đề xuất liên quan đến phần mở rộng tệp trong C#

  1. Danh sách các chương trình xuất hiện trong "Open With" menu mục
  2. Danh sách các chương trình mà xuất hiện theo khuyến cáo trong "Open With ..." thoại.

UPD:

Giả sử rằng tôi có Office11 và Office12 được cài đặt trên máy tính của tôi, chương trình mặc định cho .xls là văn phòng 11. Nếu nhìn vào HKEY_CLASSES_ROOT \ Excel.Sheet.8 \ shell \ open \ command có là một đường dẫn đến office11 excel.exe, nhưng khi tôi nhấp chuột phải vào tập tin tôi có thể chọn office12 trong mục Open With menu. Vậy hiệp hội này được lưu trữ ở đâu?

Tôi đang sử dụng C#.

Cảm ơn.

+0

nó trong registry, như vậy có lẽ bạn chỉ nên cố gắng đọc liên quan các chương trình từ sổ đăng ký – Fender

+1

Xem tại đây. Bạn phải nhận được thông tin từ đăng ký http://stackoverflow.com/questions/212906/script-to-associate-an-extension-to-a-program#212921 –

+1

bản sao có thể có của [Windows: Danh sách và Khởi chạy ứng dụng được liên kết với một extension] (http://stackoverflow.com/questions/24954/windows-list-and-launch-applications-associated-with-an-extension) –

Trả lời

11

tôi đã viết một thói quen nhỏ:

public IEnumerable<string> RecommendedPrograms(string ext) 
{ 
    List<string> progs = new List<string>(); 

    string baseKey = @"Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\." + ext; 

    using (RegistryKey rk = Registry.CurrentUser.OpenSubKey(baseKey + @"\OpenWithList")) 
    { 
    if (rk != null) 
    { 
     string mruList = (string)rk.GetValue("MRUList"); 
     if (mruList != null) 
     { 
     foreach (char c in mruList.ToString()) 
      progs.Add(rk.GetValue(c.ToString()).ToString()); 
     } 
    } 
    } 

    using (RegistryKey rk = Registry.CurrentUser.OpenSubKey(baseKey + @"\OpenWithProgids")) 
    { 
    if (rk != null) 
    { 
     foreach (string item in rk.GetValueNames()) 
     progs.Add(item); 
    } 
    //TO DO: Convert ProgID to ProgramName, etc. 
    } 

    return progs; 
    } 

mà được gọi là như vậy:

foreach (string prog in RecommendedPrograms("vb")) 
{ 
    MessageBox.Show(prog); 
} 
+1

cảm ơn vì đã dành thời gian để viết thói quen này, nhưng có vẻ như nó rất rối những loại những thứ từ đăng ký ... ví dụ về phần mở rộng xls: thường trả về không chỉ các chương trình được đề xuất, nhưng tất cả các ứng dụng đã từng mở loại tệp này (kể cả các ứng dụng được viết bởi tôi), cũng trả về chỉ một progrId Excel.Sheet.8, i đã cố gắng để serach đăng ký cho nó, nhưng chỉ tìm thấy con đường đến văn phòng 11 excel ... Dù sao một lần nữa cảm ơn một lần nữa để cung cấp câu trả lời tốt. nó nhiều hơn không có gì – Alexander

+0

Không tệ, nhưng không giúp bạn có được tên chương trình: / – StinkyCat

3

Bao giờ muốn liên kết chương trình một loại tệp trên hệ thống với ứng dụng của bạn, nhưng không thích ý tưởng tự đào sâu thông qua đăng ký? Nếu có, thì bài viết và mã này phù hợp với bạn.

System File Association

+0

cảm ơn vì đã giúp đỡ, nhưng tôi muốn nhận các liên kết chứ không phải để đặt) tôi nhìn vào mã nguồn nhưng vẫn không thể tìm được cách ( – Alexander

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