上頭丟了一個奇怪的需求, 說我們軟件開啟的網頁要能指定 browser.
當下只有 囧 可以形容.
要知道什麼軟件是瀏覽器, 目前大概只能針對已知的 browser 個別處理.
首先要做的是就是先獲取 browser 執行檔的路徑.
所有 browser 安裝後一定會產生 Shortcut, 從 Shortcut 取得就ok了
1. 所以先取得所有 *.lnk 在 start menu下的.
wchar_t szPath[MAX_PATH];
CFileInfoList files;
memset(szPath, 0x00, sizeof(szPath));
if (SHGetSpecialFolderPathW(NULL, szPath, CSIDL_PROGRAMS, false))
{
files.GetFolderInfo(szPath);
}
memset(szPath, 0x00, sizeof(szPath));
if (SHGetSpecialFolderPathW(NULL, szPath, CSIDL_COMMON_PROGRAMS, false))
{
files.GetFolderInfo(szPath);
}
2. 接著寫取得快捷路徑的方法:
BOOL GetShortcutTarget(const wchar_t *file, CString &szTarget)
{
HRESULT hr;
IShellLinkW *pLink; //IShellLink对象指针
IPersistFile *ppf; //IPersisFil对象指针
wchar_t szPah[MAX_PATH];
WIN32_FIND_DATAW FileData;
szTarget.Empty();
hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (void**)&pLink);
if (FAILED(hr))
{
SAVELOG_DANGER("CoCreateInstance failed");
return FALSE;
}
//从IShellLink对象中获取IPersistFile接口
hr = pLink->QueryInterface(IID_IPersistFile, (void**)&ppf);
if (FAILED(hr))
{
SAVELOG_DANGER("QueryInterface failed");
pLink->Release();
return FALSE;
}
// open Shortcut
hr = ppf->Load(file, STGM_READ);
if (SUCCEEDED(hr))
{
memset(szPah, 0x00, sizeof(szPah));
hr = pLink->GetPath(szPah, MAX_PATH, &FileData, SLGP_SHORTPATH);
if (SUCCEEDED(hr))
{
szTarget = szPah;
}
}
ppf->Release();
pLink->Release();
return SUCCEEDED(hr);
}
3. 針對特定名稱快捷取路徑
Internet Explorer.lnk
Mozilla Firefox.lnk
Waterfox.lnk
Navigator.lnk
Pale Moon.lnk
SeaMonkey.lnk
Google Chrome.lnk
Safari.lnk
Opera.lnk
4. 針對 Safari 處理
Safari 的快捷長的不大一樣, 所以取不到路徑, 改成取 Working Directory 並加檔案名稱
BOOL GetShortcutWorkDirectory(const wchar_t *file, CString &szDir)
{
HRESULT hr;
IShellLinkW *pLink; //IShellLink对象指针
IPersistFile *ppf; //IPersisFil对象指针
wchar_t szPah[MAX_PATH];
WIN32_FIND_DATAW FileData;
szDir.Empty();
hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLinkW, (void**)&pLink);
if (FAILED(hr))
{
SAVELOG_DANGER("CoCreateInstance failed");
return FALSE;
}
//从IShellLink对象中获取IPersistFile接口
hr = pLink->QueryInterface(IID_IPersistFile, (void**)&ppf);
if (FAILED(hr))
{
SAVELOG_DANGER("QueryInterface failed");
pLink->Release();
return FALSE;
}
// open Shortcut
hr = ppf->Load(file, STGM_READ);
if (SUCCEEDED(hr))
{
memset(szPah, 0x00, sizeof(szPah));
hr = pLink->GetWorkingDirectory(szPah, MAX_PATH);
if (SUCCEEDED(hr))
{
szDir = szPah;
}
}
ppf->Release();
pLink->Release();
return SUCCEEDED(hr);
}
5. 最後成果
// define by windows
unit = new CBrowserList::CBrowserInfo();
unit->m_Name = PTwcsdup(g_Language.GetString("default", "Default"));
unit->m_Path = PTwcsdup(L"");
this->m_list.Add(unit);
memset(szPath, 0x00, sizeof(szPath));
if (SHGetSpecialFolderPathW(NULL, szPath, CSIDL_PROGRAMS, false))
{
files.GetFolderInfo(szPath);
for (i=0; i<files.Count(); i++)
{
_GetFileName(files[i]->fullName, FileName);
if (0 == FileName.CompareNoCase(L"Internet Explorer.lnk"))
{
if (GetShortcutTarget(files[i]->fullName, Target))
{
unit = new CBrowserList::CBrowserInfo();
unit->m_Name = PTwcsdup(L"Internet Explorer");
unit->m_Path = PTwcsdup(Target);
this->m_list.Add(unit);
}
}
}
}
memset(szPath, 0x00, sizeof(szPath));
if (SHGetSpecialFolderPathW(NULL, szPath, CSIDL_COMMON_PROGRAMS, false))
{
files.GetFolderInfo(szPath);
for (i=0; i<files.Count(); i++)
{
_GetFileName(files[i]->fullName, FileName);
if (0 == FileName.CompareNoCase(L"Mozilla Firefox.lnk"))
{
if (GetShortcutTarget(files[i]->fullName, Target))
{
unit = new CBrowserList::CBrowserInfo();
unit->m_Name = PTwcsdup(L"Mozilla Firefox");
unit->m_Path = PTwcsdup(Target);
this->m_list.Add(unit);
}
}
else if (0 == FileName.CompareNoCase(L"Waterfox.lnk"))
{
if (GetShortcutTarget(files[i]->fullName, Target))
{
unit = new CBrowserList::CBrowserInfo();
unit->m_Name = PTwcsdup(L"Waterfox");
unit->m_Path = PTwcsdup(Target);
this->m_list.Add(unit);
}
}
else if (0 == FileName.CompareNoCase(L"Navigator.lnk"))
{
if (GetShortcutTarget(files[i]->fullName, Target))
{
unit = new CBrowserList::CBrowserInfo();
unit->m_Name = PTwcsdup(L"Navigator");
unit->m_Path = PTwcsdup(Target);
this->m_list.Add(unit);
}
}
else if (0 == FileName.CompareNoCase(L"Pale Moon.lnk"))
{
if (GetShortcutTarget(files[i]->fullName, Target))
{
unit = new CBrowserList::CBrowserInfo();
unit->m_Name = PTwcsdup(L"Pale Moon");
unit->m_Path = PTwcsdup(Target);
this->m_list.Add(unit);
}
}
else if (0 == FileName.CompareNoCase(L"SeaMonkey.lnk"))
{
if (GetShortcutTarget(files[i]->fullName, Target))
{
unit = new CBrowserList::CBrowserInfo();
unit->m_Name = PTwcsdup(L"SeaMonkey");
unit->m_Path = PTwcsdup(Target);
this->m_list.Add(unit);
}
}
else if (0 == FileName.CompareNoCase(L"Google Chrome.lnk"))
{
if (GetShortcutTarget(files[i]->fullName, Target))
{
unit = new CBrowserList::CBrowserInfo();
unit->m_Name = PTwcsdup(L"Google Chrome");
unit->m_Path = PTwcsdup(Target);
this->m_list.Add(unit);
}
}
else if (0 == FileName.CompareNoCase(L"Safari.lnk"))
{
if (GetShortcutWorkDirectory(files[i]->fullName, Target))
{
unit = new CBrowserList::CBrowserInfo();
unit->m_Name = PTwcsdup(L"Safari");
unit->m_Path = PTwcsdup(Target);
unit->m_Path = PTwcscat(unit->m_Path, L"Safari.exe");
this->m_list.Add(unit);
}
}
else if (0 == FileName.CompareNoCase(L"Opera.lnk"))
{
if (GetShortcutTarget(files[i]->fullName, Target))
{
unit = new CBrowserList::CBrowserInfo();
unit->m_Name = PTwcsdup(L"Opera");
unit->m_Path = PTwcsdup(Target);
this->m_list.Add(unit);
}
}
}
}
6. 呼叫
void openURL(const wchar_t *url)
{
if (g_SettingsInfo.Browser.IsEmpty())
{
ShellExecuteW(NULL, L"open", url, NULL, NULL, SW_SHOWNORMAL);
return;
}
// check Browser was exist
if (FileExists(g_SettingsInfo.Browser.GetString()))
{
ShellExecuteW(NULL, NULL, g_SettingsInfo.Browser.GetString(), url, NULL, SW_SHOWNORMAL);
return;
}
//
ShellExecuteW(NULL, _T("open"), url, NULL, NULL, SW_SHOWNORMAL);
}
沒有留言:
張貼留言