系统托盘图标的实现
#include <commctrl.h>
#pragma comment(lib,"comctl32.lib")//导入库comctl32.lib
#include <ShellAPI.h >
#define ID_TASKBARICON 100
#define WM_ICONNOTIFY (WM_USER + 101)
case WM_ICONNOTIFY:
{
switch(lParam)
{
case WM_LBUTTONDBLCLK:
// Load main window here
break;
case WM_RBUTTONUP:
{
POINT point;
HMENU hMenu, hSubMenu;
// Get mouse position
GetCursorPos(&point);
// Popup context menu
hMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDC_MY));
hSubMenu = GetSubMenu(hMenu, 0);
SetMenuDefaultItem(hSubMenu, IDC_MY, FALSE);
SetForegroundWindow(hWnd); // Per KB Article Q135788
TrackPopupMenu(hSubMenu,
TPM_LEFTBUTTON|TPM_RIGHTBUTTON|TPM_LEFTALIGN,
point.x, point.y, 0, hWnd, NULL);
PostMessage(hWnd, WM_NULL, 0, 0); // Per KB Article Q135788
DestroyMenu(hMenu);
}
break;
default:
return FALSE;
}
}
case WM_CREATE:
{
NOTIFYICONDATA nid;
// 初始化系统托盘图标
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uID = ID_TASKBARICON;
nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
nid.uCallbackMessage = WM_ICONNOTIFY;
nid.hIcon =(HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_SMALL), IMAGE_ICON, 16, 16, 0);
strcpy(nid.szTip, "My Tooltip Text");
Shell_NotifyIcon(NIM_ADD, &nid);
break;
}
///
最近我在网上收集了一些完整的代码,感觉比我实现的要好,贴出来与大家分享:
#include "Windows.h"
#include "tchar.h"
#define WM_SHELLNOTIFY WM_USER+5
#define IDI_TRAY 0
#define IDM_RESTORE 1000
#define IDM_EXIT 1010
TCHAR ClassName[] = _T("TrayIconWinClass");
TCHAR AppName[] = _T("TrayIcon Demo");
TCHAR RestoreString[] = _T("&Restore");
TCHAR ExitString[] = _T("E&xit Program");
HINSTANCE g_hInstance;
NOTIFYICONDATA note;
HMENU hPopupMenu;
INT_PTR CALLBACK ProcWinMain( HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
)
{
POINT pt;
switch(Msg)
{
case WM_CREATE:
{
hPopupMenu = CreatePopupMenu();
AppendMenu(hPopupMenu,MF_STRING,IDM_RESTORE,RestoreString);
AppendMenu(hPopupMenu,MF_STRING,IDM_EXIT,ExitString);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_SIZE:
if(wParam == SIZE_MINIMIZED)
{
note.cbSize = sizeof(NOTIFYICONDATA);
note.hWnd = hWnd;
note.uID = IDI_TRAY;
note.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
note.uCallbackMessage = WM_SHELLNOTIFY;
note.hIcon = LoadIcon(NULL,IDI_WINLOGO);
lstrcpy(note.szTip,AppName);
ShowWindow(hWnd,SW_HIDE);
Shell_NotifyIcon(NIM_ADD,¬e);
}
break;
case WM_COMMAND:
if(lParam == 0)
{
Shell_NotifyIcon(NIM_DELETE,¬e);
if(LOWORD(wParam) == IDM_RESTORE)
ShowWindow(hWnd,SW_RESTORE);
else
DestroyWindow(hWnd);
}
break;
case WM_SHELLNOTIFY:
if(wParam == IDI_TRAY)
{
if(lParam == WM_RBUTTONDOWN)
{
GetCursorPos(&pt);
TrackPopupMenu(hPopupMenu,TPM_RIGHTALIGN,pt.x,
pt.y,NULL,hWnd,NULL);
}
else if(lParam == WM_LBUTTONDBLCLK)
{
SendMessage(hWnd,WM_COMMAND,IDM_RESTORE,0);
}
}
break;
default:
return DefWindowProc(hWnd,Msg,wParam,lParam);
}
return 0;
}
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
WNDCLASSEX wc;
MSG msg;
HWND hWnd;
g_hInstance = hInstance;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW |CS_DBLCLKS;
wc.lpfnWndProc = ProcWinMain;
wc.cbClsExtra = NULL;
wc.cbWndExtra = NULL;
wc.hInstance = hInstance;
wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE);
wc.lpszMenuName = NULL;
wc.lpszClassName = ClassName;
wc.hIcon = wc.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
RegisterClassEx(&wc);
hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,ClassName,AppName,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,350,200,NULL,NULL,hInstance,NULL);
ShowWindow(hWnd,SW_SHOWNORMAL);
UpdateWindow(hWnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}