分享

VC获取默认浏览器

 firefox_zyw 2014-01-09

如何获取系统当前的默认浏览器呢?呃,如果你说,去读 HKEY_CLASSES_ROOT\http\shell\open\command 的注册表值,也不是不可以,但在
WIN7 下不一定正确。那么我是怎么知道的呢?





昨天这样读了半天,发现总是不正确,我们将 Chrome 设为默认浏览器,发现 QQ 电脑管家弹出提示,然后果断打开之,发现:











我们果断得到了一个注册表项:


HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\Ftp\UserChoice[Progid]


然后发现它的值为 ChromeHTML.FXI4CGER3K4X3DSME7GMQ74NWM





然后我们去HKEY_CLASSES_ROOT\ChromeHTML.FXI4CGER3K4X3DSME7GMQ74NWM\shell\open\command 下,就可以读出默认值了。











如果是 IE 浏览器的话,将在 HKEY_CLASSES_ROOT\IE.FTP\shell\open\command 下获取到。所以,在
WIN7 下整个获取过程如下:



  1. void LaunchDefaultBrowser()  
  2. {  
  3.     HKEY hDefBrowserPos = NULL;  
  4.     wstring wstrDefBrowserPath = L"iexplore.exe";  
  5.   
  6.     WCHAR wszBuffer[MAX_PATH + 1] = {0};  
  7.     DWORD dwDataSize = sizeof(wszBuffer);  
  8.   
  9.     if (ERROR_SUCCESS == ::RegGetValueW(  
  10.         HKEY_CURRENT_USER,  
  11.         L"Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\Ftp\\UserChoice\\",  
  12.         L"Progid",  
  13.         RRF_RT_REG_SZ,  
  14.         0,  
  15.         wszBuffer,  
  16.         &dwDataSize  
  17.         ))  
  18.     {  
  19.         wstring wstrDefBrowserPos = wszBuffer;  
  20.         wstrDefBrowserPos += L"\\shell\\open\\command\\";  
  21.         dwDataSize = sizeof(wszBuffer);  
  22.   
  23.         if (ERROR_SUCCESS == ::RegGetValueW(  
  24.             HKEY_CLASSES_ROOT,  
  25.             wstrDefBrowserPos.c_str(),  
  26.             NULL,  
  27.             RRF_RT_REG_SZ,  
  28.             0,  
  29.             wszBuffer,  
  30.             &dwDataSize  
  31.             ))  
  32.         {  
  33.             // 解出 exe 路径.  
  34.             wstrDefBrowserPath = wszBuffer;  
  35.             wstring::size_type leftQuotation = wstrDefBrowserPath.find(L'"');  
  36.             if (leftQuotation != wstring::npos)  
  37.             {  
  38.                 wstring::size_type rightQuotation = wstrDefBrowserPath.find(L'"', leftQuotation + 1);  
  39.                 if (rightQuotation != wstring::npos)  
  40.                 {  
  41.                     wstrDefBrowserPath.assign(  
  42.                         wstrDefBrowserPath.begin() + leftQuotation + 1,  
  43.                         wstrDefBrowserPath.begin() + rightQuotation  
  44.                         );  
  45.                 }  
  46.             }  
  47.         }  
  48.     }  
  49.   
  50.     ::ShellExecuteW(  
  51.         NULL,  
  52.         L"open",  
  53.         wstrDefBrowserPath.c_str(),  
  54.         NULL,  
  55.         NULL,  
  56.         SW_NORMAL  
  57.         );  
  58. }  






整个过程比较繁琐,但还是比较容易理解的。














    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多