在註冊表中跳轉是詢問什麼程序路徑在Windows 7上打開此文件擴展名(.avi)的最佳方法?還是有更好的API使用?詢問Windows 7 - 什麼程序默認打開這個文件
什麼是在註冊表中導航此正確的方法?當我安裝DivX播放器時,我注意到它偷走了VLC播放器的.avi擴展名。我對文件的頂部進行了修改,並將默認程序設置爲VLC,但我沒有看到它存儲在HKCU中的位置。
我的最終目標是讓程序知道與文件擴展名關聯的應用程序。我想問問操作系統,而不是存儲我自己的獨立查找數據。
在註冊表中跳轉是詢問什麼程序路徑在Windows 7上打開此文件擴展名(.avi)的最佳方法?還是有更好的API使用?詢問Windows 7 - 什麼程序默認打開這個文件
什麼是在註冊表中導航此正確的方法?當我安裝DivX播放器時,我注意到它偷走了VLC播放器的.avi擴展名。我對文件的頂部進行了修改,並將默認程序設置爲VLC,但我沒有看到它存儲在HKCU中的位置。
我的最終目標是讓程序知道與文件擴展名關聯的應用程序。我想問問操作系統,而不是存儲我自己的獨立查找數據。
您不會說您正在開發哪種語言,但您應該可以通過致電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;
}
}
+1,建議您不要自己窺探註冊表。 – asveikau 2011-01-19 20:35:30
瀏覽註冊表使用什麼編程語言? – 2011-01-19 20:23:26