在Windows系统中,有一个非常重要的组件就是系统托盘,用户可以在系统托盘中查看各种图标、通知和快捷方式等,非常方便。而系统托盘图标也是可以自定义的,下面我们来看一下如何利用notifyicondata实现Windows系统托盘图标的自定义化。
一、notifyicondata是什么
notifyicondata是Windows提供的一个API,主要用于在系统托盘中创建、删除、更新图标等操作。它是一个结构体类型,定义如下:
```
typedef struct _NOTIFYICONDATA {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
TCHAR szTip[128];
DWORD dwState;
DWORD dwStateMask;
TCHAR szInfo[256];
union {
UINT uTimeout;
UINT uVersion;
} DUMMYUNIONNAME;
TCHAR szInfoTitle[64];
DWORD dwInfoFlags;
GUID guidItem;
HICON hBalloonIcon;
} NOTIFYICONDATA, *PNOTIFYICONDATA;
```
其中,cbSize表示结构体大小;hWnd表示操作图标的窗口句柄;uID表示图标的ID号,用于区分不同的图标;uFlags表示如何操作图标;uCallbackMessage表示操作后的回调消息;hIcon表示图标句柄;szTip表示图标提示信息;dwState和dwStateMask用于指定图标的状态和状态掩码;szInfo和szInfoTitle用于设置图标弹出气泡提示的标题和内容;uTimeout表示提示显示时长;dwInfoFlags表示提示的类型;guidItem用于声明图标;hBalloonIcon用于设置弹出气泡的图标。
二、实现自定义图标
1. 创建图标
要创建一个系统托盘的图标,我们首先需要创建一个窗口,通常是一个隐藏的窗口,然后在窗口中使用notifyicondata创建系统托盘图标。
示例代码如下:
```
// 创建窗口
HWND hwnd = CreateWindow("MainWindow", "Main Window", 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
// 创建图标
NOTIFYICONDATA nid = { 0 };
nid.cbSize = sizeof(nid);
nid.hWnd = hwnd;
nid.uID = ID_MYICON;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nid.uCallbackMessage = WM_MYMESSAGE;
nid.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYICON));
_tcscpy_s(nid.szTip, _countof(nid.szTip), _T("My Icon"));
Shell_NotifyIcon(NIM_ADD, &nid);
```
上述代码创建了一个窗口,并创建了一个ID为ID_MYICON的图标,指定了图标的ID号、提示信息、回调消息以及图标句柄等。
2. 更新图标
如果需要更新系统托盘中的图标,可以使用notifyicondata的uFlags字段中的NIF_ICON标志来指定需要更新的图标,然后使用Shell_NotifyIcon函数将更新后的图标内容通知系统托盘。
示例代码如下:
```
// 更新图标
NOTIFYICONDATA nid = { 0 };
nid.cbSize = sizeof(nid);
nid.hWnd = hwnd;
nid.uID = ID_MYICON;
nid.uFlags = NIF_ICON;
nid.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYICON_NEW));
Shell_NotifyIcon(NIM_MODIFY, &nid);
```
上述代码将ID为ID_MYICON的图标更新为了一个新的图标,使用了NIM_MODIFY标志来指定图标更新。
3. 删除图标
如果要删除系统托盘中的图标,可以使用Shell_NotifyIcon函数并将notifyicondata的uFlags字段中的NIF_GUID标志设为真。
示例代码如下:
```
// 删除图标
NOTIFYICONDATA nid = { 0 };
nid.cbSize = sizeof(nid);
nid.hWnd = hwnd;
nid.uID = ID_MYICON;
nid.uFlags = NIF_GUID;
Shell_NotifyIcon(NIM_DELETE, &nid);
```
上述代码使用了NIM_DELETE标志来删除ID为ID_MYICON的图标。
三、总结
通过以上介绍,我们了解了如何利用Windows提供的notifyicondata实现自定义系统托盘图标的方法,可以根据自己的需求来创建、更新、删除系统托盘图标。如果需要在系统托盘图标上添加弹出气泡或提示信息等功能,也可以通过notifyicondata中的相关字段来实现。总之,notifyicondata是一个非常便利的API,是Windows系统中实现自定义系统托盘图标不可或缺的一部分。