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之 ...
随机推荐
- JDK各个版本比较
JDK5 自动装箱与拆箱: 枚举 静态导入,如:import staticjava.lang.System.out 可变参数(Varargs) 内省(Introspector) 主要用于操作JavaB ...
- vue 微信公众号分享后支付失效页面URL不变的坑
微信分享后支付页面还是初始页面,这个问题解决了, created(){ //判断是否是IOS设备 // IOS分享时的页面是首页,也就是进入页而不是当前页.所有可以采用刷新当前页,让进入页的链接改成当 ...
- 探索Redis设计与实现6:Redis内部数据结构详解——skiplist
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- NLayer Architecture in abp
https://aspnetboilerplate.com/Pages/Documents/NLayer-Architecture Introduction The layering of an ap ...
- python - 小米推送使用
1. 小米文档及SDK下载 1.文档介绍 https://dev.mi.com/console/doc/detail?pId=863 sdk说明: 2.开发者需要登录开发者网站(申请AppID, Ap ...
- linux卸载
centos平台 yum remove xxxrpm包,rpm -e xxxtar包直接删除该文件或者make uninstall xxx
- FPGA前仿真后仿真
前仿真 后仿真 时序(综合后)仿真 时序仿真将时延考虑进去,包括综合后产生的(与.或.非)门时延,还有布局布线产生的时延. 综合(Synthesize),就是将HDL语言设计输入翻译成由与.或.非门和 ...
- 慎用margin系列2---ie6双倍边距问题
IE6下有一个著名的margin双倍bug 一.什么是双边距Bug? 先来看图: 我们要让绿色盒模型在蓝色盒模型之内向左浮动,并且距蓝色盒模型左侧100像素.这个例子很常见,比如在网页布局中,侧边栏靠 ...
- python#父与子编程之旅-11嵌套与可变循环
for multiplier in range(5,8): for i in range(2,11): print(i,"x",multiplier,"=",i ...
- POJ-1639 Picnic Planning 度数限制最小生成树
解法参考的论文:https://wenku.baidu.com/view/8abefb175f0e7cd1842536aa.html 觉得网上的代码好像都是用邻接矩阵来实现的,觉得可能数据量大了会比较 ...
