C++:windows消息windowsToast的使用

# C++

简介

windowsToast是一个集成了window的toast消息提醒的第三方c++库,可以十分便捷地在windows下显示toast消息提醒。

使用步骤

导入库

如果担心冲突的话就导入之后在每一条wintoast的命令前面加上wintoastlib:: 即可,但是我无所谓,所以说直接导入后加using namespace std;

一般还需要包含windows库,所以说一并加入

1
2
3
4
5
#include <string>
#include "wintoastlib.h"
#include <windows.h>

using namespace WinToastLib;

定义ToastHandler

ToastHandler定义了当展示的toast消息接受不同的响应之后所执行的命令,通过继承IWinToastHandler 我们可以自定义自己想要的响应程序。

查看IWinToastHandler 的定义我们得知其有以下几种状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class IWinToastHandler {
public:
enum WinToastDismissalReason {
UserCanceled = ToastDismissalReason::ToastDismissalReason_UserCanceled,
ApplicationHidden = ToastDismissalReason::ToastDismissalReason_ApplicationHidden,
TimedOut = ToastDismissalReason::ToastDismissalReason_TimedOut
};

virtual ~IWinToastHandler() = default;
virtual void toastActivated() const = 0;
virtual void toastActivated(int actionIndex) const = 0;
virtual void toastDismissed(WinToastDismissalReason state) const = 0;
virtual void toastFailed() const = 0;
};

对于这些未定义的虚函数,我们对其继承并且加以定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class MyToastHandler : public WinToastLib::IWinToastHandler {
public:
void toastActivated() const {
std::cout << "The user clicked in this toast" << std::endl;
exit(0);
}
void toastActivated(int actionIndex) const {
std::cout << "The user clicked on action #" << actionIndex << std::endl;
exit(16 + actionIndex);
}

void toastDismissed(WinToastDismissalReason state) const {
switch (state) {
case UserCanceled:
std::cout << "The user dismissed this toast" << std::endl;
exit(1);
break;
case TimedOut:
std::cout << "The toast has timed out" << std::endl;
exit(2);
break;
case ApplicationHidden:
std::cout << "The application hid the toast using ToastNotifier.hide()" << std::endl;
exit(3);
break;
default:
std::cout << "Toast not activated" << std::endl;
exit(4);
break;
}
}
void toastFailed() const {
std::wcout << L"Error showing current toast" << std::endl;
exit(5);
}
};

我们也可以对于这些响应写出更为复杂的交互逻辑,但是在这里仅仅展示不同情况输出不同内容提示的代码。

定义WinToastTemplate

WinToastTemplate 可以理解为所需要展示的消息提示的具体内容,下面是一个简单的函数示例,包含了从初始化定义到自定义格式和内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
static void ShowNotification(std::wstring& appName, std::wstring& firstLine, std::wstring& secondLine, std::wstring& imagePath,std::wstring& hero_imagePath) {
std::wstring appUserModelID = L"SystemProxy_Agency_Tool";

//这里是初始化消息提示的appnamde和appID
//appname不能包含特殊字符,appname中的_会被转化为空格
WinToast::instance()->setAppName(appName);
WinToast::instance()->setAppUserModelId(appUserModelID);

//这里是设定格式为ImageAndText02
WinToastTemplate templ = WinToastTemplate(WinToastTemplate::ImageAndText02);

//设定具体的文本内容和图片路径
//WinToastTemplate::CropHint::Square指的是将图片裁剪为正方形

templ.setTextField(firstLine, WinToastTemplate::FirstLine);
templ.setTextField(secondLine, WinToastTemplate::SecondLine);
//展示小图片
templ.setImagePath(imagePath, WinToastTemplate::CropHint::Square);
//展示大图片
templ.setHeroImagePath(hero_imagePath);

//展示toast,样式为我们设定好了的templ,返回函数为我们指定的MyToastHandler
if (WinToastLib::WinToast::instance()->initialize()) {
WinToastLib::WinToast::instance()->showToast(templ, new MyToastHandler());
//消息延时5s后自动退出
Sleep(5000);
}
}

更多的消息提示样式可以看看作者的库里面写的说明:
mohabouje/WinToast(github.com)

或者可以看看这位大佬写的示例:
C++: Windows Toast Notification - CodeProject

调用消息提醒

使用这种方式创建消息提醒有一个缺点,就是创建出来的命令提示符的黑框会一直保持到消息消失,十分的丑。

所以说可以选择使用bat的start /b间接启动,来使得黑框最小化:

1
start /b "" E:\AgencyProxyTools\messageBox.exe

Reference

mohabouje/WinToast(github.com)

C++: Windows Toast Notification - CodeProject

C++ WIn10 通知:WinToast_c语言调用win10操作中心发送通知-CSDN博客