2015-09-06 67 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库相关。