2011-01-19 85 views
1

在註冊表中跳轉是詢問什麼程序路徑在Windows 7上打開此文件擴展名(.avi)的最佳方法?還是有更好的API使用?詢問Windows 7 - 什麼程序默認打開這個文件

什麼是在註冊表中導航此正確的方法?當我安裝DivX播放器時,我注意到它偷走了VLC播放器的.avi擴展名。我對文件的頂部進行了修改,並將默認程序設置爲VLC,但我沒有看到它存儲在HKCU中的位置。

我的最終目標是讓程序知道與文件擴展名關聯的應用程序。我想問問操作系統,而不是存儲我自己的獨立查找數據。

+0

瀏覽註冊表使用什麼編程語言? – 2011-01-19 20:23:26

回答

5

您不會說您正在開發哪種語言,但您應該可以通過致電assocquerystring聯繫shlwapi.dll來完成此操作。

assocquerystring API函數將返回文件關聯數據,而不必手動跳入註冊表並處理其中的惡魔。大多數語言都支持調用Windows API,所以你應該很好。

更多信息可以在這裏找到:

http://www.pinvoke.net/default.aspx/shlwapi.assocquerystring

這裏:

http://msdn.microsoft.com/en-us/library/bb773471%28VS.85%29.aspx

編輯:一些示例代碼:

private void SomeProcessInYourApp() 
{ 
    // Get association for doc/avi 
    string docAsscData = AssociationsHelper.GetAssociation(".doc"); // returns : docAsscData = "C:\\Program Files\\Microsoft Office\\Office12\\WINWORD.EXE" 
    string aviAsscData = AssociationsHelper.GetAssociation(".avi"); // returns : aviAsscData = "C:\\Program Files\\Windows Media Player\\wmplayer.exe" 

    // Get association for an unassociated extension 
    string someAsscData = AssociationsHelper.GetAssociation(".blahdeblahblahblah"); // returns : someAsscData = "C:\\Windows\\system32\\shell32.dll" 
} 

internal static class AssociationsHelper 
{ 
    [DllImport("Shlwapi.dll", SetLastError = true, CharSet = CharSet.Auto)] 
    static extern uint AssocQueryString(AssocF flags, AssocStr str, string pszAssoc, string pszExtra, 
     [Out] StringBuilder pszOut, [In][Out] ref uint pcchOut); 

    [Flags] 
    enum AssocF 
    { 
     Init_NoRemapCLSID = 0x1, 
     Init_ByExeName = 0x2, 
     Open_ByExeName = 0x2, 
     Init_DefaultToStar = 0x4, 
     Init_DefaultToFolder = 0x8, 
     NoUserSettings = 0x10, 
     NoTruncate = 0x20, 
     Verify = 0x40, 
     RemapRunDll = 0x80, 
     NoFixUps = 0x100, 
     IgnoreBaseClass = 0x200 
    } 

    enum AssocStr 
    { 
     Command = 1, 
     Executable, 
     FriendlyDocName, 
     FriendlyAppName, 
     NoOpen, 
     ShellNewValue, 
     DDECommand, 
     DDEIfExec, 
     DDEApplication, 
     DDETopic 
    } 

    public static string GetAssociation(string doctype) 
    { 
     uint pcchOut = 0; // size of output buffer 

     // First call is to get the required size of output buffer 
     AssocQueryString(AssocF.Verify, AssocStr.Executable, doctype, null, null, ref pcchOut); 

     // Allocate the output buffer 
     StringBuilder pszOut = new StringBuilder((int)pcchOut); 

     // Get the full pathname to the program in pszOut 
     AssocQueryString(AssocF.Verify, AssocStr.Executable, doctype, null, pszOut, ref pcchOut); 

     string doc = pszOut.ToString(); 
     return doc; 
    } 
} 
+0

+1,建議您不要自己窺探註冊表。 – asveikau 2011-01-19 20:35:30

相關問題