前言
笔者有需求,需要获取当前的默认浏览器的路径。网上的其他方法笔者没有去试。这里笔者采用的方式在win10 下是可行的,win7、winXp 没有测试。笔者使用 QQ电脑管家—>工具箱—>上网—>浏览器保护 进行默认浏览器设置 是不成功的。所以还是到 Win10 设置—>默认应用—>Web浏览器 进行设置是可行。
分析
笔者这里那 QQ浏览器和Chrome浏览器 进行测试。
打开http或者https网站链接时的默认浏览器是在下面的注册表项中进行关联的
计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http
计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\https
一般切换默认浏览器后这2个都是一样的,当然你也可以手动改成不一样的。
具体默认浏览器的设置是在计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice 项下的ProgId键对应的值中。
ProgId是个啥呢?全称应该为program identifier程序名称信息。
QQBrowser默认是安装当前机器下的,所以它的ProgId在HKEY_LOCAL_MACHINE
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\QQBrowser.Protocol
Chrome默认是安装在当前用户下的,所以它的ProgId在HKEY_CURRENT_USER
计算机\HKEY_CURRENT_USER\Software\Classes\ChromeHTML.WVRE7ETNMLLK7SQAQPVF6OOAKA
所以我们通过注册表信息能得到当前默认浏览器的全路径。
代码
代码很简单,就是注册表的读取,代码笔者使用的MFC那一套。
CString CUtility::GetDefaultBrowser()
{
// 计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http
CString browserPath = _T("");
CString browserCmd = _T("");
CRegKey reg;
if (reg.Open(HKEY_CURRENT_USER,
_T("Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice"),
KEY_READ) == ERROR_SUCCESS)
{
TCHAR szValue[512] = { 0 };
DWORD dwSize = 512;
if (reg.QueryStringValue(_T("ProgId"),szValue,&dwSize) == ERROR_SUCCESS)
{
// 计算机\HKEY_LOCAL_MACHINE\Software\Classes\ 或者 计算机\HKEY_CURRENT_USER\Software\Classes\ 下
CString ProgId = szValue;
browserCmd.Format(_T("SOFTWARE\\Classes\\%s\\shell\\open\\command"),ProgId);
reg.Close();
TCHAR szValue2[512] = { 0 };
DWORD dwSize2 = 512;
if(reg.Open(HKEY_LOCAL_MACHINE,browserCmd,KEY_READ) == ERROR_SUCCESS)
{
if (reg.QueryStringValue(_T(""),szValue2,&dwSize2) == ERROR_SUCCESS)
{
browserCmd = szValue2;
}
}
else if( reg.Open(HKEY_CURRENT_USER,browserCmd,KEY_READ) == ERROR_SUCCESS )
{
if (reg.QueryStringValue(_T(""),szValue2,&dwSize2) == ERROR_SUCCESS)
{
browserCmd = szValue2;
}
}
}
}
if(!browserCmd.IsEmpty())
{
int index = browserCmd.ReverseFind(L'.');
browserPath = browserCmd.Mid(1,index+3);
}
return browserPath;
}