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



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

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

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

但是,它们似乎都使用过时的命名空间,例如MESSAGE_HANDLER_EX这给了我一大堆错误。有谁知道如何做到这一点?

正如这里已经提到的,您指出的示例项目不使用 MFC,而是使用 WTL,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

[ 后期编辑 ]

对不起,我之前的例子是错误的!根据文档,在调用任何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:将工具栏按钮添加到任务栏按钮浮出控件。

MESSAGE_HANDLER_EX宏是 WTL 的一部分。它在atlcrack.h中定义。 很可能您需要获取最新的 WTL 才能在 Visual Studio 2015 中编译项目。

正如 ISun 已经提到的,任务栏进度可以基于此 MSDN 文章中描述的 API 实现:https://msdn.microsoft.com/en-us/library/windows/desktop/dd378460(v=vs.85(.aspx#progress

ITaskbarList3界面有一个很好的包装器:https://www.codeproject.com/Articles/42345/Windows-Goodies-in-C-Taskbar-Progress-and-Status

相关内容

  • 没有找到相关文章

最新更新