[windows/C]托盘区中增删改自己的图标

参考: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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值