参考:https://blog.csdn.net/sf9090/article/details/102640368
参考:https://www.cnblogs.com/duzouzhe/archive/2010/04/08/1707050.html
运行下面示例代码之前,需要先往资源文件里面导入任意两个.icon文件
/*
* Shell_NotifyIcon的第一个参数
NIM_ADD 增加一个图标到托盘区
NIM_DELETE 从托盘区删除一个图标
NIM_MODIFY 修改图标
NIM_SETFOCUS 将焦点(Focus)返回托盘区。这个消息通常在托盘区图标完成了用户界面下的操作后发出。比如一个托盘图标显示了一个快捷菜单,然后用户按下ESC键了操作,这时使用NIM_SETFOCUS将焦点继续保留在托盘区。该项仅在系统外壳与常用控制DLL( Shlwapi.dll与Comctl32.dll)5.0以上版本才可用。
NIM_SETVERSION 指定使用特定版本的系统外壳与常用控制DLL。缺省值为0,表示使用Win95方式。该项仅在系统外壳与常用控制DLL 5.0以上版本才可用。
*/
/*
* NOTIFYICONDATA结构体的成员
cbSize 以字节计的结构大小,以适应不同版本。
hWnd 接收Windows消息的窗口句柄。
uID 托盘图标的ID。
uFlags 指示结构中的哪些成员包含有效数据,可选值:NIF_ICON, NIF_MESSAGE,NIF_TIP,NIF_STATE,NIF_INFO,NIF_GUID。
uCallbackMessage 回调消息ID,由用户自定义。与一个自定义的消息处理函数关联。
hIcon 托盘图标的句柄。
szTip 托盘图标的提示字符串。
注意:以下数据成员仅限系统外壳与常用控制DLL 5.0及以上版本才有效!
dwState 图标的状态:NIS_HIDDEN-隐藏,或NIS_SHAREDICON-可视。
dwStateMask 图标状态掩码,用以设置dwState
szInfo 气球型提示(Balloon ToolTip)的字符串。
uTimeout 以毫秒计的提示显示时间
uVersion 确定所依赖的版本。0-Win95,NOTIFYICON_VERSION-Win2000
szInfoTitle 气球型提示的标题
dwInfoFlags 设置气球型提示所用的图标(类似MessageBox中所使用的图标):
NIIF_ERROR 错误
NIIF_INFO 信息
NIIF_NONE 没有图标
NIIF_WARNING 警告
NIIF_ICON_MASK 6.0版本保留
NIIF_NOSOUND 限6.0版本,不播放对应的声音
*/
简单版本:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
#include "resource.h"
int main(int argc, char* argv[]) {
BOOL isLive = TRUE;
BOOL isFristIcon = TRUE;
BOOL isCreate = FALSE;
BOOL isShow = FALSE;
const PNOTIFYICONDATA p = (PNOTIFYICONDATA)malloc(sizeof(NOTIFYICONDATA));
const HMODULE hmodule = GetModuleHandle(NULL);
system("title 图标显示隐藏测试程序 ");
printf(" 1.创建图标\n");
printf(" 2.显示图标(追加图标到任务栏)\n");
printf(" 3.隐藏图标(从任务栏删除图标)\n");
printf(" 4.更改图标(删除并重新追加)\n");
printf(" 5.更改图标(更改图标资源)\n");
printf(" 6.闪烁图标(更改图标资源)[补充:任意键暂停]\n");
printf(" 0.退出\n");
printf("请输入选项:");
while (isLive) {
switch (_getch() - 48) {
case 0: {
isLive = FALSE;
break;
}
case 1: {
if (!isCreate) {
p->hWnd = GetForegroundWindow();
p->cbSize = sizeof(NOTIFYICONDATA);
p->uID = isFristIcon ? IDI_ICON1 : IDI_ICON2;
p->uFlags = NIF_ICON;
p->hIcon = LoadIcon(hmodule, MAKEINTRESOURCE(isFristIcon ? IDI_ICON1 : IDI_ICON2));
isCreate = TRUE;
}
break;
}
case 2: {
if (isCreate && !isShow) {
Shell_NotifyIcon(NIM_ADD, p);
isShow = TRUE;
}
break;
}
case 3: {
if (isCreate && isShow) {
Shell_NotifyIcon(NIM_DELETE, p);
isShow = FALSE;
}
break;
}
case 4: {
if (isCreate) {
isFristIcon = !isFristIcon;
Shell_NotifyIcon(NIM_DELETE, p);
p->uID = isFristIcon ? IDI_ICON1 : IDI_ICON2;
p->hIcon = LoadIcon(hmodule, MAKEINTRESOURCE(isFristIcon ? IDI_ICON1 : IDI_ICON2));
Shell_NotifyIcon(NIM_MODIFY, p);
Shell_NotifyIcon(NIM_ADD, p);
}
break;
}
case 5: {
if (isCreate) {
isFristIcon = !isFristIcon;
DestroyIcon(p->hIcon);
p->hIcon = LoadIcon(hmodule, MAKEINTRESOURCE(isFristIcon ? IDI_ICON1 : IDI_ICON2));
Shell_NotifyIcon(NIM_MODIFY, p);
}
break;
}
case 6: {
if (isCreate) {
BOOL isFlush = TRUE;
while (!_kbhit()) {
if (p->hIcon) {
DestroyIcon(p->hIcon);
p->hIcon = NULL;
}
else
p->hIcon = LoadIcon(hmodule, MAKEINTRESOURCE(isFristIcon ? IDI_ICON1 : IDI_ICON2));
Shell_NotifyIcon(NIM_MODIFY, p);
isFlush = !isFlush;
Sleep(500);
}
}
if (!p->hIcon)
p->hIcon = LoadIcon(hmodule, MAKEINTRESOURCE(isFristIcon ? IDI_ICON1 : IDI_ICON2));
Shell_NotifyIcon(NIM_MODIFY, p);
_getch();
break;
}
}
}
if (isCreate && isShow)
Shell_NotifyIcon(NIM_DELETE, p);
free(p);
return 0;
}
进阶版本:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
#include "resource.h"
/*
* Shell_NotifyIcon
NIM_ADD 增加一个图标到托盘区
NIM_DELETE 从托盘区删除一个图标
NIM_MODIFY 修改图标
NIM_SETFOCUS 将焦点(Focus)返回托盘区。这个消息通常在托盘区图标完成了用户界面下的操作后发出。比如一个托盘图标显示了一个快捷菜单,然后用户按下ESC键了操作,这时使用NIM_SETFOCUS将焦点继续保留在托盘区。该项仅在系统外壳与常用控制DLL( Shlwapi.dll与Comctl32.dll)5.0以上版本才可用。
NIM_SETVERSION 指定使用特定版本的系统外壳与常用控制DLL。缺省值为0,表示使用Win95方式。该项仅在系统外壳与常用控制DLL 5.0以上版本才可用。
*/
/*
* NOTIFYICONDATA
cbSize 以字节计的结构大小,以适应不同版本。
hWnd 接收Windows消息的窗口句柄。
uID 托盘图标的ID。
uFlags 指示结构中的哪些成员包含有效数据,可选值:NIF_ICON, NIF_MESSAGE,NIF_TIP,NIF_STATE,NIF_INFO,NIF_GUID。
uCallbackMessage 回调消息ID,由用户自定义。与一个自定义的消息处理函数关联。
hIcon 托盘图标的句柄。
szTip 托盘图标的提示字符串。
注意:以下数据成员仅限系统外壳与常用控制DLL 5.0及以上版本才有效!
dwState 图标的状态:NIS_HIDDEN-隐藏,或NIS_SHAREDICON-可视。
dwStateMask 图标状态掩码,用以设置dwState
szInfo 气球型提示(Balloon ToolTip)的字符串。
uTimeout 以毫秒计的提示显示时间
uVersion 确定所依赖的版本。0-Win95,NOTIFYICON_VERSION-Win2000
szInfoTitle 气球型提示的标题
dwInfoFlags 设置气球型提示所用的图标(类似MessageBox中所使用的图标):
NIIF_ERROR 错误
NIIF_INFO 信息
NIIF_NONE 没有图标
NIIF_WARNING 警告
NIIF_ICON_MASK 6.0版本保留
NIIF_NOSOUND 限6.0版本,不播放对应的声音
*/
//#define WM_IAWENTRAY WM_USER+5 //系统托盘的自定义消息
int main(int argc, char* argv[]) {
BOOL isLive = TRUE;
BOOL isFristIcon = TRUE;
BOOL isCreate = FALSE;
BOOL isShow = FALSE;
const PNOTIFYICONDATA p = (PNOTIFYICONDATA)malloc(sizeof(NOTIFYICONDATA));
const HMODULE hmodule = GetModuleHandle(NULL);
system("title 图标显示隐藏测试程序 ");
printf(" 1.创建图标\n");
printf(" 2.显示图标(追加图标到任务栏)\n");
printf(" 3.隐藏图标(从任务栏删除图标)\n");
printf(" 4.更改图标(删除并重新追加)\n");
printf(" 5.更改图标(更改图标资源)\n");
printf(" 6.闪烁图标(更改图标资源)[补充:任意键暂停]\n");
printf(" 0.退出\n");
printf("请输入选项:");
while (isLive) {
switch (_getch() - 48) {
case 0: {
isLive = FALSE;
break;
}
case 1: {
if (!isCreate) {
p->hWnd = GetForegroundWindow();
p->cbSize = sizeof(NOTIFYICONDATA);
strcpy_s(p->szTip, 20, isFristIcon ? "你吃了吗?" : "吃了!");
p->uID = isFristIcon ? IDI_ICON1 : IDI_ICON2;
p->uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP | NIF_INFO;
strcpy_s(p->szInfoTitle, 20, isFristIcon ? "图标1标题" : "图标2标题");
strcpy_s(p->szInfo, 20, isFristIcon ? "图标1显示成功!" : "图标2显示成功!");
p->dwInfoFlags = NIIF_INFO;
p->hIcon = LoadIcon(hmodule, MAKEINTRESOURCE(isFristIcon ? IDI_ICON1 : IDI_ICON2));
//p->uCallbackMessage = WM_IAWENTRAY;//定义点击图标时的回调消息
isCreate = TRUE;
}
break;
}
case 2: {
if (isCreate && !isShow) {
Shell_NotifyIcon(NIM_ADD, p);
isShow = TRUE;
}
break;
}
case 3: {
if (isCreate && isShow) {
Shell_NotifyIcon(NIM_DELETE, p);
isShow = FALSE;
}
break;
}
case 4: {
if (isCreate) {
isFristIcon = !isFristIcon;
Shell_NotifyIcon(NIM_DELETE, p);
strcpy_s(p->szTip, 20, isFristIcon ? "你吃了吗?" : "吃了!");
strcpy_s(p->szInfoTitle, 20, isFristIcon ? "图标1标题" : "图标2标题");
strcpy_s(p->szInfo, 20, isFristIcon ? "图标1显示成功!" : "图标2显示成功!");
p->dwInfoFlags = NIIF_NONE;
p->uID = isFristIcon ? IDI_ICON1 : IDI_ICON2;
p->hIcon = LoadIcon(hmodule, MAKEINTRESOURCE(isFristIcon ? IDI_ICON1 : IDI_ICON2));
Shell_NotifyIcon(NIM_MODIFY, p);
Shell_NotifyIcon(NIM_ADD, p);
}
break;
}
case 5: {
if (isCreate) {
isFristIcon = !isFristIcon;
DestroyIcon(p->hIcon);
p->hIcon = LoadIcon(hmodule, MAKEINTRESOURCE(isFristIcon ? IDI_ICON1 : IDI_ICON2));
Shell_NotifyIcon(NIM_MODIFY, p);
}
break;
}
case 6: {
if (isCreate) {
BOOL isFlush = TRUE;
p->uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
while (!_kbhit()) {
if (p->hIcon) {
DestroyIcon(p->hIcon);
p->hIcon = NULL;
}
else
p->hIcon = LoadIcon(hmodule, MAKEINTRESOURCE(isFristIcon ? IDI_ICON1 : IDI_ICON2));
Shell_NotifyIcon(NIM_MODIFY, p);
isFlush = !isFlush;
Sleep(500);
}
}
p->uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP | NIF_INFO;
if (!p->hIcon)
p->hIcon = LoadIcon(hmodule, MAKEINTRESOURCE(isFristIcon ? IDI_ICON1 : IDI_ICON2));
Shell_NotifyIcon(NIM_MODIFY, p);
_getch();
break;
}
}
}
if (isCreate && isShow)
Shell_NotifyIcon(NIM_DELETE, p);
free(p);
return 0;
}