Shell_NotifyIcon函数使用

1.Shell_NotifyIcon介绍

== Shell_NotifyIcon是Windows中用来生成系统托盘图标的API函数 ==

函数原型:

BOOL Shell_NotifyIcon(DWORD              dwMessage,PNOTIFYICONDATA    lpdata);

参数说明(dwMessage、Ipdata)

1. dwMessage:[输入参数] 说明要执行的动作。动作的可选值如下

NIM_ADD 增加一个图标到托盘区
NIM_DELETE 从托盘区删除一个图标
NIM_MODIFY 修改图标
NIM_SETFOCUS将焦点返回托盘区。这个消息通常在托盘区完成了用户界面下的操作后发出。比如一个托盘图标显示一个快捷菜单,然后用户按下ESC键了操作,这是使用NIM_SETFOCUS将焦点继续保留在托盘区。这项仅在系统外壳与常用控制DLL5.0版本以上才可以使用。
NIM_SETVERSION 指定使用特定版本的系统的外壳与常用控制DLL。缺省值为0,表示使用win95方式。该项仅在系统外壳与常用控制DLL5.0以上版本才能用。

  2.lpdata:【输入参数】 一个指向NOTUFYICONDATA结构的指针。结构说明如下:
 typedef struct _NOTIFYICONDATA {DWORD     cbSize;HWND      hWND;UINT      uFlags;UINT      uCallbackMessage;HICON     hIcon;TCHAR     szTip[64];DWORD     dwState;DWORD     dwStateMask;TCHAR     szInfo [256];union {UINT  uTimeout;UINT   uVersion;};TCHAR     szInfoTitle[64];DWORD     dwInfoFlags;GUID      guidItem;} NOTIFYICONDATA, *PNOTIFYICONDATA;
cbSize 以字节记的结构大小,以适应不同版本。
hWnd 接收Windows消息的窗口句柄。
uID 托盘图标的ID
uFlags 指示结构中的哪些成员包含有效数据,可选值: NIF_ICON, NIF_MESSAGE,NIF_TIP,NIF_STATE, NIF_INFO, NIF_GUID.
uCallbackMessage 回调消息ID, 由用户自定义。与一个自定义的消息处理函数关联。
hIcon 托盘图标句柄。
szTip 托盘图标的提示字符串。
注意:以下数据成员仅限系统外壳与常用控制DLL5.0及以上版本才有效。
dwState 图标的状态:NIS_HIDDEN-隐藏, 或NIS_SHAREDICON-可视。
dwStateMask 图标状态掩码,用以设置dwState
szInfo 气球型提示 (Balloon ToolTip) 的字符串。
uTimeout 以毫秒计的提示显示时间
uVersion 确定所依赖的版本。 0-Win95, NOTIFYICON_BERSION-Win2000
SzInfoTitle 气球型提示的标题
dwInfoFlags 设置气球型提示所用的图标(类似MessageBox中所使用的图标):NIIF_ERROR  错误NIIF_INFO 信息NIIF_NONE 没有图标NIIF_WARNING 警告NIIF_ICON_MASK 6.0版本保留NIIF_NOSOUND 限6.0版本, 不播放对应的声音
guidItem 6.0版本保留

使用思路:

本人是在点击窗口最小化中事件中添加此函数,例如我点击最小化,然后再托盘处产生了一个程序图标。
1.先定义一个全局的变量:
NOTIFYICONDATA e

2.然后在适当的位置对e进行初始化,我是在主窗口的 while (GetMessage (&msg, NULL, 0, 0)) 语句之前初始化的。

3.最后在最小化处添加函数:Shell_NotifyIcon(NIM_ADD, &e);

详细代码见下(亲测):

#include <windows.h>
#include <tchar.h>
#include "ShellAPI.h"
#include "resource1.h"
#include <string.h>#define WM_IAWENTRAY    WM_USER+5  //系统托盘的自定义消息  //定义全局变量
HINSTANCE g_hInst;
NOTIFYICONDATA e;LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{g_hInst = hInstance; //获取该程序实例句柄  static TCHAR szAppName[] = TEXT("TimeWork");HWND         hwnd;MSG          msg;WNDCLASS     wndclass;wndclass.style = CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc = WndProc;wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hInstance = hInstance;wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName = NULL;wndclass.lpszClassName = szAppName;if (!RegisterClass(&wndclass)){MessageBox(NULL, TEXT("This program requires Windows NT!"),szAppName, MB_ICONERROR);return 0;}hwnd = CreateWindow(szAppName,                  // window class name  TEXT("托盘程序"), // window caption  WS_OVERLAPPEDWINDOW,        // window style  CW_USEDEFAULT,              // initial x position  CW_USEDEFAULT,              // initial y position  CW_USEDEFAULT,              // initial x size  CW_USEDEFAULT,              // initial y size  NULL,                       // parent window handle  NULL,                       // window menu handle  hInstance,                  // program instance handle  NULL);                     // creation parameters  ShowWindow(hwnd, iCmdShow);UpdateWindow(hwnd);//初始化NOTIFYICONDATA结构  e.cbSize = sizeof(NOTIFYICONDATA);e.hWnd = hwnd;e.uID = IDI_ICON1;e.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;e.uCallbackMessage = WM_IAWENTRAY;e.hIcon = LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_ICON1));strcpy_s(e.szTip,20,"我太难了!"); //添加的托盘提示符字符串,鼠标放在托盘处会显示提示文字
//  _tcscpy(e.szTip, TEXT("TimeWork正在工作!\r\n点击打开主界面")); //_tcscpy是windows宏,需包含头文件tchar.h  while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;
}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{HDC         hdc;PAINTSTRUCT ps;RECT        rect;switch (message){case WM_CREATE:return 0;case WM_PAINT:hdc = BeginPaint(hwnd, &ps);GetClientRect(hwnd, &rect);DrawText(hdc, TEXT("Hello, my fridents!"), -1, &rect,DT_SINGLELINE | DT_CENTER | DT_VCENTER);EndPaint(hwnd, &ps);return 0;case WM_IAWENTRAY:if (wParam == IDI_ICON1) {if (lParam == WM_LBUTTONDOWN) {//还可以在这个地方加入一个菜单,鼠标右键单击时显示  ShowWindow(hwnd, SW_SHOWNORMAL);return TRUE;}}return FALSE;case WM_SYSCOMMAND:switch (wParam){case SC_CLOSE:DestroyWindow(hwnd);PostQuitMessage(0);break;case SC_MINIMIZE:ShowWindow(hwnd, SW_HIDE);Shell_NotifyIcon(NIM_ADD, &e); //最小化时隐藏窗口并设置系统托盘  break;}return 0;case WM_DESTROY:Shell_NotifyIcon(NIM_DELETE, &e);PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, message, wParam, lParam); }

具体工程文件见:点击
或者微信搜索:MeiXiangDao2020 关注媒想到叭回复:Shell 获取工程
注意:其中图标资源自行添加
不会添加资源的见大牛博客:link
本文参考:https://www.cnblogs.com/duzouzhe/archive/2010/04/08/1707050.html
https://blog.csdn.net/say_high/article/details/11092961

C窗口程序——Shell_NotifyIcon()函数的使用相关推荐

  1. C#窗口程序入口函数

    参考图 说明 新建一个C#窗口程序,会有两个主要文件:Program.cs.Form1.cs 作用 Program.cs 用于写逻辑代码 Form1.cs 用于拖拽控件.管理控件资源          ...

  2. 【OpenGL】七、桌面窗口搭建 ( 导入头文件 | 桌面程序入口函数 | 注册窗口 | 创建窗口 | 显示窗口 )

    文章目录 一.导入头文件 二.桌面程序入口函数 三.注册窗口 四.创建窗口 五.显示窗口 六.完整代码示例 七.相关资源 基于 [OpenGL]一.Visual Studio 2019 创建 Wind ...

  3. QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数

    版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者"tingsking18"和主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消 ...

  4. Win32API 窗口程序的创建7大步骤

    Win32API 窗口程序的创建7大步骤 1 定义WinMain入口函数 2 定义窗口处理函数 WindowsProc(用来处理消息.有如公司业务处理,具体干活的人.) 3 注册窗口类 Registe ...

  5. 让Win32窗口程序拥有控制台窗口

    让Win32窗口程序拥有控制台窗口 首先,为什么我们有了普通窗口后还要控制台窗口呢?因为我们可以用它方便的输出调试信息,而且普通玩家看到了也会觉得很高端.如果他会输几条命令,可能他会以为自己就是黑客了 ...

  6. 【Qt】Qt窗口程序

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 程序设计 04. 程序执行 05. 预留 06. 附录 01. 概述 程序要实现的功能是:运行开始出现一个对话框,按下登录 ...

  7. 第一个 Win32 窗口程序

    第一个 Win32 窗口程序 程序骨架 int WinMain(){ // 设计窗口外观及交互响应,注册,申请专利RegisterClass(...) ;// 生产窗口 CreateWindow(.. ...

  8. 用java创建窗口程序,创建窗口的应用程序

    创建窗口的应用程序 通过前面的基础知识的学习,已经对ctypes库的基本功能学会了使用,为了加强这种知识训练,以及运用刚学习的知识的快乐,我们来创建一个稍稍复杂一点的应用程序.这个应用程序是所有后面应 ...

  9. 4.2第一个窗口程序

    创建Win32工程和MessageBox函数 前面讲的程序都是使用控制台界面来接受输入.显示输出的.要想使用窗口界面与用户交互必须首先创建一个Win32工程. (1)运行VC++6.0,选择菜单命令& ...

  10. 【win32汇编】0x04 第一个窗口程序

    第一个win32汇编窗口程序,主要来自 win32汇编语言程序设计,然后加上了自己查阅msdn文档的一些理解,基本过程: start入口地址 --> _WinMain主函数 --> 定义一 ...

最新文章

  1. mapreduce编程初级实践_涨姿势!2020最好的 10 大国外编程学习网站
  2. IE6不能用gzip压缩脚本,一个流毒甚广的谣言
  3. 求两个整数数组乘积最小值
  4. [].slice.call
  5. linux命令行安装libxml,Ubuntu 14.04下libxml2的安装和使用
  6. Keil(MDK-ARM-STM32)系列教程(四)工程目标选项配置(Ⅱ)
  7. 今日初学C语言写的几个程序。
  8. html参考文献_毕业设计参考文献格式(要求与范例)
  9. dev代码拷贝中文乱码的解决方案
  10. centos 6.4 postfix mysql_CentOS 6.4下Postfix邮件服务安装和基本配置
  11. CPP-week fourteen
  12. JavaScript 启动性能瓶颈分析与解决方案
  13. linux安装好的mysql rpm -qa |grep mysql不见
  14. 计算机科学导论整理知识点,计算机科学导论教程重点
  15. bc8-android导航,路畅A6导航刷机固件 4.09 CN-A6-GBDS-BC8-VIN-256-V1.51
  16. 软考 - 软件设计师 - 完整知识点笔记 - 按考频整理
  17. IDEA如何创建XML文件并用浏览器打开
  18. java多态app_【Java基础】Java中的多态
  19. EditText相关设置
  20. Python爬虫4.2 — ajax(动态网页数据抓取)用法教程

热门文章

  1. MATLAB2010激活后无法打开MATLAB的解决方法
  2. matlab2010 simulink,张德丰 (2010) MATLAB/Simulink建模与仿真实例精讲. 机械工业出版社, 北京....
  3. jsp页面中插入jsp代码片段
  4. iTunes驱动程序缺少用于导入和刻录CD与DVD的注册设置
  5. PCB设计敷铜时的天线效应
  6. LLDP协议编写要点
  7. 【UCOSIII操作系统】硬件初始化篇(1)硬件初始化以及开始运行系统
  8. c语言实现鼠标驱动,鼠标驱动程序
  9. 计划策略10、11、40
  10. 苹果背后的拼多多双11“农产品狂想曲”