正如这里已经提到的,你所指向的示例项目并没有使用MFC,而是使用WTL,它是ATL的一个扩展,目前并未随Visual Studio一起发布。因此,为了使它们编译通过,您需要下载WTL、安装,并清除一些已弃用的内容。
当然,ITaskbarList3接口也可以用于MFC应用程序。以下是一个简单的示例:
class CMainDialog : public CDialog
{
CComPtr<ITaskbarList3> m_spTaskbarList;
};
BOOL CMainDialog::OnInitDialog()
{
CDialog::OnInitDialog();
HRESULT hr = ::CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER,
__uuidof(ITaskbarList3), reinterpret_cast<void**>(&m_spTaskbarList));
if(SUCCEDDED(hr))
{
hr = m_spTaskbarList->HrInit();
}
return TRUE;
}
当然,在应用程序的InitInstance
方法中调用AfxOleInit也是必要的。
[稍后编辑]
抱歉,我之前的示例是错误的!根据文档,必须处理“TaskbarButtonCreated”注册消息,以确保任务栏按钮就位,然后才能调用任何ITaskbarList3方法。
UINT WM_TASKBAR_BUTTON_CREATED = ::RegisterWindowMessage(_T("TaskbarButtonCreated"));
BEGIN_MESSAGE_MAP(CMainDialog, CDialogEx)
ON_REGISTERED_MESSAGE(WM_TASKBAR_BUTTON_CREATED, OnTaskbarButtonCreated)
END_MESSAGE_MAP()
LRESULT CMainDialog::OnTaskbarButtonCreated(WPARAM wParam, LPARAM lParam)
{
HRESULT hr = ::CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER,
IID_ITaskbarList3, reinterpret_cast<void**>(&m_spTaskbarList));
if (FAILED(hr))
{
return 0;
}
hr = m_spTaskbarList->HrInit();
return 0;
}
还可以参考这篇文章:Windows 7:向任务栏按钮弹出菜单添加工具栏按钮。
2015可再发行(x86)-14.0.24215
。 - Peter Kentish