windows API 创建系统托盘图标
系统托盘在我们使用的程序中很普遍,下面我们来看一个很不错的例子,使用Win32 API实现,对理解系统托盘有些帮助。
- #include <windows.h>
 - #define IDR_PAUSE 12
 - #define IDR_START 13
 - /*
 - #include <shellapi.h>
 - #pragma comment(lib, "shell32.lib")
 - */
 - LPCTSTR szAppName = TEXT("服务程序");
 - LPCTSTR szWndName = TEXT("服务程序");
 - HMENU hmenu;//菜单句柄
 - LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 - {
 - NOTIFYICONDATA nid;
 - UINT WM_TASKBARCREATED;
 - POINT pt;//用于接收鼠标坐标
 - int xx;//用于接收菜单选项返回值
 - // 不要修改TaskbarCreated,这是系统任务栏自定义的消息
 - WM_TASKBARCREATED = RegisterWindowMessage(TEXT("TaskbarCreated"));
 - switch (message)
 - {
 - case WM_CREATE://窗口创建时候的消息.
 - nid.cbSize = sizeof(nid);
 - nid.hWnd = hwnd;
 - nid.uID = 0;
 - nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
 - nid.uCallbackMessage = WM_USER;
 - nid.hIcon = LoadIcon(NULL, IDI_APPLICATION);
 - lstrcpy(nid.szTip, szAppName);
 - Shell_NotifyIcon(NIM_ADD, &nid);
 - hmenu=CreatePopupMenu();//生成菜单
 - AppendMenu(hmenu,MF_STRING,IDR_PAUSE,"暂停服务");//为菜单添加两个选项
 - AppendMenu(hmenu,MF_STRING,IDR_START,"恢复服务");
 - break;
 - case WM_USER://连续使用该程序时候的消息.
 - if (lParam == WM_LBUTTONDOWN)
 - MessageBox(hwnd, TEXT("Win32 API 实现系统托盘程序,双击托盘可以退出!"), szAppName, MB_OK);
 - if (lParam == WM_LBUTTONDBLCLK)//双击托盘的消息,退出.
 - SendMessage(hwnd, WM_CLOSE, wParam, lParam);
 - if (lParam == WM_RBUTTONDOWN)
 - {
 - GetCursorPos(&pt);//取鼠标坐标
 - ::SetForegroundWindow(hwnd);//解决在菜单外单击左键菜单不消失的问题
 - EnableMenuItem(hmenu,IDR_PAUSE,MF_GRAYED);//让菜单中的某一项变灰
 - xx=TrackPopupMenu(hmenu,TPM_RETURNCMD,pt.x,pt.y,NULL,hwnd,NULL);//显示菜单并获取选项ID
 - if(xx==IDR_PAUSE) MessageBox(hwnd, TEXT("111"), szAppName, MB_OK);
 - if(xx==IDR_START) MessageBox(hwnd, TEXT("222"), szAppName, MB_OK);
 - if(xx==0) PostMessage(hwnd,WM_LBUTTONDOWN,NULL,NULL);
 - //MessageBox(hwnd, TEXT("右键"), szAppName, MB_OK);
 - }
 - break;
 - case WM_DESTROY://窗口销毁时候的消息.
 - Shell_NotifyIcon(NIM_DELETE, &nid);
 - PostQuitMessage(0);
 - break;
 - default:
 - /*
 - * 防止当Explorer.exe 崩溃以后,程序在系统系统托盘中的图标就消失
 - *
 - * 原理:Explorer.exe 重新载入后会重建系统任务栏。当系统任务栏建立的时候会向系统内所有
 - * 注册接收TaskbarCreated 消息的顶级窗口发送一条消息,我们只需要捕捉这个消息,并重建系
 - * 统托盘的图标即可。
 - */
 - if (message == WM_TASKBARCREATED)
 - SendMessage(hwnd, WM_CREATE, wParam, lParam);
 - break;
 - }
 - return DefWindowProc(hwnd, message, wParam, lParam);
 - }
 - int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
 - LPSTR szCmdLine, int iCmdShow)
 - {
 - HWND hwnd;
 - MSG msg;
 - WNDCLASS wndclass;
 - HWND handle = FindWindow(NULL, szWndName);
 - if (handle != NULL)
 - {
 - MessageBox(NULL, TEXT("Application is already running"), szAppName, MB_ICONERROR);
 - return 0;
 - }
 - 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;
 - }
 - // 此处使用WS_EX_TOOLWINDOW 属性来隐藏显示在任务栏上的窗口程序按钮
 - hwnd = CreateWindowEx(WS_EX_TOOLWINDOW,
 - szAppName, szWndName,
 - WS_POPUP,
 - CW_USEDEFAULT,
 - CW_USEDEFAULT,
 - CW_USEDEFAULT,
 - CW_USEDEFAULT,
 - NULL, NULL, hInstance, NULL);
 - ShowWindow(hwnd, iCmdShow);
 - UpdateWindow(hwnd);
 - while (GetMessage(&msg, NULL, 0, 0))
 - {
 - TranslateMessage(&msg);
 - DispatchMessage(&msg);
 - }
 - return msg.wParam;
 - }
 
windows API 创建系统托盘图标的更多相关文章
- C/C++ Windows API——获取系统指定目录(转)
		
原文地址:C/C++ Windows API——获取系统指定目录 经测试,在win10 VS2017中用wprintf()输出正常,SHGetSpecialFolderPath函数也正常运行 但是用M ...
 - 使用Windows api 获得系统时间并生成文件夹
		
// 使用window api 获得系统时间 // 生成 #include "stdafx.h" #include <Windows.h> #include <d ...
 - windows API 统计系统字体
		
最近工作中遇到一个需求,需要统计当前系统中包含的所有字体.在网上逛了一圈后发现了EnumFontFamiliesEx这个API好像就可以实现这个功能.这里将自己对这个API的理解做一个记录,算是对这块 ...
 - windows API 创建临时文件
		
创建完临时文件后,即可用C\C++标准函数写入.读取,也可以用API.MFC方法来操作. TCHAR szPathName[MAX_PATH]; TCHAR szFileName[MAX_PATH]; ...
 - Windows API获取系统配置文件的配置参数
		
在Windows平台下获取系统配置文件(如:System.ini)的配置参数. 系统配置文件System.ini的内容如下: [SYSTEM] ServiceIP = 10.128.11.99:600 ...
 - 调用windows api 获取系统分辨率
		
c++中: int cxScreen,cyScreen; cxScreen=GetSystemMetrics(SM_CXSCREEN); cyScreen=GetSystemMetrics(SM_CY ...
 - windows API 开发飞机订票系统 图形化界面 (二)
		
首先,用到的数据结构的定义.以及全局变量和函数的声明如下: // Flight.c : 定义应用程序的入口点. // #include "stdafx.h" //订单 typede ...
 - windows API 开发飞机订票系统 图形化界面 (一)
		
去年数据结构课程设计的作品,c语言实现,图形化界面使用windows API实现. 首发在我csdn博客:http://blog.csdn.net/u013805360/article/details ...
 - Windows API 函数列表 附帮助手册
		
所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...
 
随机推荐
- Linux系统之-文件系统,桌面环境
			
文件系统 文件类型普通文件,目录文件,连接文件,设备与设备文件,套接字,管道 普通文件(regular file):就是一般存取的文件,由ls -al显示出来的属性中,第一个属性为 [-],例如 [- ...
 - python的OS模块生成100个txt文件
			
#!/user/bin/env/python35 # -*-coding:utf-8-*- # author:Keekuun """ 问题:生成一个文件夹,文件夹下面生成 ...
 - 机器学习笔记--classification_report&精确度/召回率/F1值
			
https://blog.csdn.net/akadiao/article/details/78788864 准确率=正确数/预测正确数=P 召回率=正确数/真实正确数=R F1 F1值是精确度和召回 ...
 - 【C++第一个Demo】---控制台RPG游戏4【角色系统】
			
[角色基类] #ifndef _ROLE_H_ #define _ROLE_H_ #include<list> #include<vector> #include " ...
 - js少写if语句
			
1.if else if (bool) { a =1; } else { a = 2 } // 简写 a = bool ? 1 : 2: 2.if if (bool) { a = fn() } //简 ...
 - T1317:【例5.2】组合的输出
			
[题目描述] 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r≤n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数. 现要求你用递归的方法输出所有组 ...
 - Apache的虚拟主机功能(基于IP、域名、端口号)
			
Apache虚拟主机就是在一个Apache服务器上配置多个虚拟主机,实现一个服务器提供多站点服务,其实就是访问同一个服务器上的不同目录. 主要有三种方法: 1.通过不同的IP地址 2.通过不同的域名 ...
 - 爬虫(三)—— BeautifulSoup模块获取元素
			
目录 BeautifulSoup 一.BeautifulSoup简介 二.安装模块 三.解析器 四.Beautiful Soup的使用 五.查找元素 1.遍历文档树 2.搜索文档树 Beautiful ...
 - 08、python的基础--->文件操作
			
注:用btyes方式的一般都是在“非文字类的(比如图片)” 1.文件的读取 >>>第1种 #绝对路径 s = open('E:\天气.txt', mode='r', encoding ...
 - 为什么要进行 URL 编码???
			
作者:降瑞雪 cnblogs.com/jerrysion/p/5522673.html 我们都知道Http协议中参数的传输是"key=value"这种简直对形式的,如果要传多个参数 ...
 
			
		