windows API 创建系统托盘图标
来源:互联网 发布:医疗软件开发平台 编辑:程序博客网 时间:2024/05/16 09:15
系统托盘在我们使用的程序中很普遍,下面我们来看一个很不错的例子,使用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;
- }
===================================================
实例2:
//窗口过程LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){static NOTIFYICONDATA nid;static LPCTSTR szAppName = TRAY_TITLE;static HMENU hmenu = NULL;//菜单句柄// 不要修改TaskbarCreated,这是系统任务栏自定义的消息UINT 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 | NIF_INFO;nid.uCallbackMessage = WM_USER;nid.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MAIN));lstrcpy(nid.szTip, szAppName);lstrcpy(nid.szInfo, TRAY_START_TITLE);lstrcpy(nid.szInfoTitle, TRAY_TITLE);nid.dwInfoFlags = NIIF_INFO;Shell_NotifyIcon(NIM_ADD, &nid);hmenu = CreatePopupMenu();//生成菜单AppendMenu(hmenu, MF_STRING, IDR_EXIT, TRAY_MENU_EXIT_TITLE);break;}//连续使用该程序时候的消息.case WM_USER:{if (lParam == WM_LBUTTONDOWN){MessageBox(hwnd, TRAY_START_TITLE, szAppName, MB_OK);}if (lParam == WM_RBUTTONDOWN){POINT pt;//用于接收鼠标坐标GetCursorPos(&pt);//取鼠标坐标::SetForegroundWindow(hwnd);//解决在菜单外单击左键菜单不消失的问题int xx = TrackPopupMenu(hmenu, TPM_RETURNCMD, pt.x, pt.y, NULL, hwnd, NULL);//显示菜单并获取选项IDif (xx == IDR_EXIT){SendMessage(hwnd, WM_CLOSE, wParam, lParam);}}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 CWinMain::CreateMainWin(){WNDCLASS wndclass;// 定义窗口类结构变量 HWND hwnd;// 定义窗口句柄 MSG msg;// 定义消息结构变量 HINSTANCE hInstance = GetModuleHandle(NULL);//本实例句柄/* 定义窗口类的各属性 */wndclass.style = CS_HREDRAW | CS_VREDRAW;// 改变窗口大小则重画 wndclass.lpfnWndProc = WndProc;// 窗口函数为 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 = L"window 窗口创建 ";// 窗口类名为 window 窗口创建 /* 注册窗口类 */if (!RegisterClass(&wndclass)) return 0;/* 创建窗口 */hwnd = CreateWindow(L"window 窗口创建 ", // 窗口类名 window 窗口创建 L"window 窗口创建 ",// 窗口名 window 窗口创建 WS_OVERLAPPEDWINDOW,// 重叠式窗口 CW_USEDEFAULT, CW_USEDEFAULT,// 左上角屏幕坐标默认值 CW_USEDEFAULT, CW_USEDEFAULT,// 窗口宽度和高度默认值 NULL,// 此窗口无父窗口 NULL,// 此窗口无主菜单 hInstance,// 创建此窗口的实例句柄 NULL);// 此窗口无创建参数 /* 显示并更新窗口 */ShowWindow(hwnd, SW_HIDE);// 显示窗口 UpdateWindow(hwnd);// 更新窗口的客户区 /* 消息循环 */while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);// 键盘消息转换 DispatchMessage(&msg);// 派送消息给窗口函数 }return msg.wParam;// 返回退出值 }
0 0
- windows API 创建系统托盘图标
- windows API 创建系统托盘图标
- windows API 创建系统托盘图标
- Windows API 之系统托盘图标
- 创建QT系统托盘图标
- 创建系统托盘图标
- 隐藏Windows系统托盘图标
- 获取Windows系统托盘图标
- Windows 系统托盘图标
- Windows系统托盘图标实践(AWT)
- 详解隐藏windows系统托盘图标
- API实现添加系统托盘图标及其菜单
- Shell_NotifyIcon(系统托盘图标API函数)详解
- 使用Win32 API做个系统托盘图标
- 使用Win32 API做个系统托盘图标
- 使用Win32 API做个系统托盘图标
- 使用Win32 API做个系统托盘图标
- 在VS里创建Windows窗体,让其最小化在系统托盘,并显示一个Icon图标
- pair的用法
- 夯实基础——插入排序
- 最大权闭合图理论讲解
- Heritrix1.14.4配置
- 小黑小波比.Ubuntu下安装搜狗输入法
- windows API 创建系统托盘图标
- c动态内存分配
- 常用指令
- Mysql启动错误: Can’t create test file xxx lower-test
- 安卓webview系列(基础)——如何用webview执行JS
- CString的方法大全
- 数据库散列储存
- DWZ框架初次使用
- 如何在Eclipse下查看JDK源代码