2015-09-06 68 views
1

我使用下面的代碼有任務欄的跳轉列表在特定頁面打開用戶的默認瀏覽器。跳轉列表在Windows 10沒有

一切都已經現在工作正常了大約一年在Win 7/8,但與Windows 10單擊任務欄上的任務時,瀏覽器將不會調用和微軟的文檔顯示沒有從贏8更改10

bool SetUpJumpList() 
{ 
    HRESULT hr; 
    CComPtr<ICustomDestinationList> pDestList; 
    hr = pDestList.CoCreateInstance (CLSID_DestinationList , NULL , CLSCTX_INPROC_SERVER); 
    if (FAILED (hr)) 
    { 
      return false; 
    } 
    hr = pDestList->SetAppID (_TBID); 
    if (FAILED (hr)) 
    { 
      return false; 
    } 
    UINT cMaxSlots; 
    CComPtr<IObjectArray> pRemovedItems; 
    hr = pDestList->BeginList (&cMaxSlots , IID_PPV_ARGS (&pRemovedItems)); 
    if (FAILED (hr)) 
    { 
      return false; 
    } 
    CComPtr<IObjectCollection> pObjColl; 
    hr = pObjColl.CoCreateInstance (CLSID_EnumerableObjectCollection , NULL , CLSCTX_INPROC_SERVER); 
    if (FAILED (hr)) 
    { 
      return false; 
    } 
    if (!AddJumpListTasks (pObjColl)) 
    { 
      return false; 
    } 
    CComQIPtr<IObjectArray> pTasksArray = pObjColl; 
    if (!pTasksArray) 
    { 
      return false; 
    } 
    hr = pDestList->AddUserTasks (pTasksArray); 
    if (FAILED (hr)) 
    { 
      return false; 
    } 
    hr = pDestList->CommitList(); 
    return SUCCEEDED (hr); 
} 

bool AddJumpListTasks (IObjectCollection* pObjColl) 
{ 
    wchar_t pBuf[ MAX_PATH ]; 
    int bytes = GetModuleFileName (NULL , pBuf , MAX_PATH); 
    CJumpListTask aTasks[ ] = 
    { 
      { _T ("https://www.google.co.uk") , _T ("Home Page") , _T ("Home") , 0 }, 
      { _T ("https://www.google.co.uk") , _T ("Twitter Page") , _T ("Twitter") , 9 }, 
      { _T ("https://www.google.co.uk") , _T ("Facebook Page") , _T ("Facebook") , 10 } 
    }; 
    CString strBrowser; 
    DWORD size = 1024; 
    AssocQueryString (0 , ASSOCSTR_EXECUTABLE , L"http" , L"Open" , strBrowser.GetBufferSetLength (size) , &size); 
    for (int i = 0; i < _countof (aTasks); i++) 
    { 
      if (!AddJumpListTask (pObjColl , aTasks[ i ] , strBrowser , pBuf)) 
      { 
        strBrowser.ReleaseBuffer(); 
        return false; 
      } 
    } 
    strBrowser.ReleaseBuffer(); 
    return true; 
} 

bool AddJumpListTask (IObjectCollection* pObjColl , const CJumpListTask& rTask , LPCTSTR szExePath , LPCTSTR pBuf) 
{ 
    HRESULT hr; 
    CComPtr<IShellLink> pLink; 
    hr = pLink.CoCreateInstance (CLSID_ShellLink , NULL , CLSCTX_INPROC_SERVER); 
    if (FAILED (hr)) 
    { 
      return false; 
    } 
    hr = pLink->SetPath (szExePath); 
    if (FAILED (hr)) 
    { 
      return false; 
    } 
    hr = pLink->SetArguments (rTask.szArgs); 
    if (FAILED (hr)) 
    { 
      return false; 
    } 
    hr = pLink->SetIconLocation (pBuf , rTask.nIconIndex); 
    if (FAILED (hr)) 
    { 
      return false; 
    } 
    CComQIPtr<IPropertyStore> pPropStore = pLink; 
    PROPVARIANT pv; 
    if (!pPropStore) 
    { 
      return false; 
    } 
    hr = InitPropVariantFromString (CT2CW (rTask.szTitle) , &pv); 
    if (FAILED (hr)) 
    { 
      return false; 
    } 
    hr = pPropStore->SetValue (PKEY_Title , pv); 
    PropVariantClear (&pv); 
    if (FAILED (hr)) 
    { 
      return false; 
    } 
    hr = pPropStore->Commit(); 
    if (FAILED (hr)) 
    { 
      return false; 
    } 
    hr = pObjColl->AddObject (pLink); 
    return SUCCEEDED (hr); 
} 

我注意到其他一些應用程序(如CCleaner)也使用這種方法,但它們不起作用,但Microsoft應用程序(如Office 2013)仍然可以正常工作,所以問題是如何在Windows 10上再次運行此應用程序?

我敢肯定,這是不相關的customDestinations-MS存儲在CustomDestinations文件夾文件作爲一個乾淨的Windows 10的安裝出現相同的非功能性。

任務欄任務菜單與所需的文本和圖標和調試創建顯示正確的網址與正確的默認瀏覽器和瀏覽器路徑一起加入。

編輯:

使用Visual Studio 2015工具包的Windows XP v140_xp

+0

你可以嘗試在呼叫AssocQueryString名「.html」或「熱媒」的不是‘http’。 'AssocQueryString'表示它需要一個擴展名。 –

+0

什麼是您的調試告訴你都嘗試名「.html」和「熱媒」‘HTTP’/‘HTTPS’不工作在Windows 7/8/8.1失敗 –

+0

點。 – Shrek

回答

1

正如你可以使用一種解決方法,如果可能的話給你,MFC類 「CJumplist」 從最新的Windows SDK。

我們發現它會解決這個問題,但前提是採用了最新的SDK版本。使用一個使用相同MFC類的舊SDK(例如Windows 7 SDK)會導致與您遇到的問題完全相同的問題。

這是一個示例代碼在Windows 10正與VC2013和最新的SDK(目標V12.0),但只有在共享DLL中使用MFC時。與靜態MFC Dll鏈接似乎不起作用。

CJumpList *pJumpList = new CJumpList(); 
pJumpList->SetAppID(m_pszAppID); 
result = pJumpList->AddTask(szPath, _T("-data1"), _T("number 4"), szPath, 0); 
result = pJumpList->AddTask(szPath, _T("-data2"), _T("number 5"), szPath, 0); 
pJumpList->CommitList(); 
delete pJumpList; 

我不知道Microsoft開發人員在此課程中做了哪些更改才能使其工作。我們純粹的Win32代碼遇到與您報告相同的問題。

0

稍微更新一下,由於其他問題後重新安裝VS但沒有檢查XP兼容性選項導致Jumplists再次工作,我不需要XP的支持,但我認爲這個問題是與XP庫相關。