[转载]Win32 API 实现系统托盘程序
2009-06-29 15:40
465 查看
文章来源:http://blog.csdn.net
作者blog:http://blog.csdn.net/dohkoos/
作者blog:http://blog.csdn.net/dohkoos/
#include <windows.h> #include "resource.h" LPCTSTR szAppName = TEXT("TrayHelper"); LPCTSTR szCaption = TEXT("TrayIcon"); LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HMENU hMenu; static UINT WM_TASKBARCREATED; POINT point; HINSTANCE hInstance; NOTIFYICONDATA nid; switch (message) { case WM_CREATE: // 不要修改TaskbarCreated 字符串,这是系统任务栏自定义的消息 WM_TASKBARCREATED = RegisterWindowMessage(TEXT("TaskbarCreated")); hInstance = ((LPCREATESTRUCT)lParam)->hInstance; hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_TRAYMENU)); hMenu = GetSubMenu(hMenu, 0); nid.cbSize = sizeof(nid); nid.hWnd = hWnd; nid.uID = IDI_PIRAMIDE; nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; nid.uCallbackMessage = WM_USER; nid.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_PIRAMIDE)); strcpy(nid.szTip, szAppName); Shell_NotifyIcon(NIM_ADD, &nid); break; case WM_USER: if (lParam == WM_RBUTTONDOWN) { GetCursorPos(&point); SetForegroundWindow(hWnd); // 修正当用户按下ESCAPE 键或者在菜单之外单击鼠标时菜单不会消失的情况 TrackPopupMenu(hMenu, TPM_RIGHTBUTTON, point.x, point.y, 0, hWnd, NULL); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDM_TRAYSETTINGS: MessageBox (hWnd, TEXT("Settings not yet implemented!"), szAppName, MB_ICONEXCLAMATION | MB_OK) ; return 0; case IDM_TRAYHELP: MessageBox (hWnd, TEXT("Help not yet implemented!"), szAppName, MB_ICONEXCLAMATION | MB_OK) ; return 0; case IDM_TRAYABOUT: MessageBox (hWnd, TEXT("About not yet implemented!"), szAppName, MB_ICONEXCLAMATION | MB_OK) ; return 0; case IDM_TRAYEXIT: SendMessage(hWnd, WM_CLOSE, 0, 0); return 0; } break; case WM_DESTROY: nid.uID = IDI_PIRAMIDE; // 修正点击Exit 菜单退出后图标仍在托盘区显示, nid.hWnd = hWnd; // 要把鼠标在图标上面过一下才会消失。 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, szCaption); 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, szCaption, 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; }
相关文章推荐
- [转载]Win32 API 实现系统托盘程序
- Win32 API 实现系统托盘程序
- Win32 API 实现系统托盘程序
- Win32 API 实现系统托盘程序
- Win32 API 实现系统托盘程序
- Win32 API 实现系统托盘程序
- Win32 API实现系统托盘
- VC++MFC对话框应用程序实现程序最小化到系统托盘
- MFC中提示对话框的滑动弹出和程序图标加入系统托盘的实现
- Win32 Api(显示程序系统菜单)
- 利用Visual C++实现系统托盘程序
- 用J2SE6.0试用 - 用新增API实现TrayIcon系统托盘图标
- (转载整理)程序安装流程及如何实现文件在系统后自动重启(windows)
- C#实现WinForm程序的动态系统托盘图标
- Windows系统托盘图标程序之Java实现
- 详解基于Sbo DI API独立程序系统登录的实现 推荐
- 使用Win32 API 实现MDI程序
- C#开发WinForm程序如何实现程序最小化到系统托盘
- Win32 Api(显示程序系统菜单)
- 系统理解Win32 API和MFC(上)转载