1

在QT里,结合使用ITaskbarList3的SetOverlayIcon方法,可以实现消息提醒功能。

效果如下:

3.gif

Window API

image.png

https://learn.microsoft.com/zh-cn/windows/win32/api/shobjidl_...

代码如下:

image.png

green.ico是一个16*16大小的icon

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class ITaskbarList3;

class MainWindow : public QMainWindow {
    Q_OBJECT

  public:
    MainWindow(QWidget* parent = nullptr);
    ~MainWindow();

    void updateOverlayIcon();

  private:
    ITaskbarList3* taskbarList;
    bool m_has = false;
};
#endif  // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"

#include <ShObjIdl.h>
#include <atlbase.h>

#include <QDebug>
#include <QTimer>



MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) {
    CoInitialize(NULL);

    CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList3, (void**)&taskbarList);

    QTimer* timer = new QTimer(this);
    connect(timer, &QTimer::timeout, this, &MainWindow::updateOverlayIcon);
    timer->start(1000);  // 每5秒更新一次

    resize(800,600);
}

MainWindow::~MainWindow() {
    if (taskbarList) {
        taskbarList->Release();
    }
    CoUninitialize();
}

void MainWindow::updateOverlayIcon() {
    if (!m_has) {
        QImage image(":/green.ico");
        HICON hIcon = image.toHICON();

        if (!hIcon) {
            qDebug() << "HICON load error";
        }

        HRESULT hr = taskbarList->SetOverlayIcon((HWND)this->winId(), hIcon, L"New messages");
        if (FAILED(hr)) {
            qDebug() << "SetOverlayIcon failed with error code:" << hr;
        }
        m_has = true;
    } else {
        taskbarList->SetOverlayIcon((HWND)this->winId(), NULL, L"New messages");
        m_has = false;
    }
}

点墨
26 声望3 粉丝

全栈前端开发工程师