如何使用任务栏按钮显示进度条?

3
我正在使用Visual Studio 2015更新一个应用程序。该应用程序是15年前编写的,我想在任务栏按钮上添加进度条叠加,这是Windows 7现在提供的功能。我已经按照所有我能找到的教程进行了操作,例如:

http://www.codeproject.com/KB/vista/SevenGoodiesTaskbarStatus.aspx

and

https://www.codeproject.com/Articles/80082/Windows-How-to-display-progress-bar-on-taskbar-i

但是他们似乎都使用过时的命名空间,例如MESSAGE_HANDLER_EX,这给我带来了许多错误。有人知道如何解决吗?

2
请参阅msdn上的文章:https://msdn.microsoft.com/zh-cn/library/windows/desktop/dd378460(v=vs.85).aspx#progress - Matan Shahar
你正在使用哪个版本的C++,并且用什么来进行GUI界面的开发? - Error - Syntactical Remorse
可再发行程序包称为2015可再发行(x86)-14.0.24215 - Peter Kentish
2个回答

3
正如这里已经提到的,你所指向的示例项目并没有使用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))
    {
        // handle error
        return 0;
    }


    hr = m_spTaskbarList->HrInit();
    // ....
    // ... other taskbar list stuff.

    return  0;
}

还可以参考这篇文章:Windows 7:向任务栏按钮弹出菜单添加工具栏按钮


谢谢,我应该在哪里实现SetProgressState?是在OnInitDialog还是其他地方? - Peter Kentish
可能想在其他地方调用它,以展示某些事件的发生。由你决定。 - Ovidiu Cucu
成功了?真的吗? - Anton Duzenko

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接