正如这里已经提到的,您指出的示例项目不使用 MFC,而是使用 WTL,它是 ATL 的扩展,当前未随 Visual Studio 提供。
因此,要使它们编译,您必须 download 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。
[稍后编辑]
对不起,我之前的例子是错误的!根据文档,在调用任何 ITaskbarList3 方法之前,必须处理“TaskbarButtonCreated”注册消息,以确保任务栏按钮到位。
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))
{
// handle error
return 0;
}
hr = m_spTaskbarList->HrInit();
// ....
// ... other taskbar list stuff.
return 0;
}
另请参阅这篇文章:Windows 7: Adding toolbar buttons to taskbar button flyout。