#include <windows.h>
#include "resource.h"
#define WM_TRAY (WM_USER + 100)
#define WM_TASKBAR_CREATED RegisterWindowMessage(TEXT("TaskbarCreated"))
#define APP_NAME TEXT("托盘程序")
#define APP_TIP TEXT("Win32 API 实现系统托盘程序")
NOTIFYICONDATA nid;
HMENU
hMenu;
void
InitTray(
HINSTANCE
hInstance,
HWND
hWnd)
{
nid.cbSize =
sizeof
(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uID = IDI_TRAY;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP | NIF_INFO;
nid.uCallbackMessage = WM_TRAY;
nid.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TRAY));
lstrcpy(nid.szTip, APP_NAME);
hMenu = CreatePopupMenu();
AppendMenu(hMenu, MF_STRING, ID_SHOW, TEXT(
"提示"
));
AppendMenu(hMenu, MF_STRING, ID_EXIT, TEXT(
"退出"
));
Shell_NotifyIcon(NIM_ADD, &nid);
}
void
ShowTrayMsg()
{
lstrcpy(nid.szInfoTitle, APP_NAME);
lstrcpy(nid.szInfo, TEXT(
"收到一条消息!"
));
nid.uTimeout = 1000;
Shell_NotifyIcon(NIM_MODIFY, &nid);
}
LRESULT
CALLBACK WndProc(
HWND
hWnd,
UINT
uMsg,
WPARAM
wParam,
LPARAM
lParam)
{
switch
(uMsg)
{
case
WM_TRAY:
switch
(lParam)
{
case
WM_RBUTTONDOWN:
{
POINT pt; GetCursorPos(&pt);
SetForegroundWindow(hWnd);
int
cmd = TrackPopupMenu(hMenu, TPM_RETURNCMD, pt.x, pt.y, NULL, hWnd,
NULL);
if
(cmd == ID_SHOW)
MessageBox(hWnd, APP_TIP, APP_NAME, MB_OK);
if
(cmd == ID_EXIT)
PostMessage(hWnd, WM_DESTROY, NULL, NULL);
}
break
;
case
WM_LBUTTONDOWN:
MessageBox(hWnd, APP_TIP, APP_NAME, MB_OK);
break
;
case
WM_LBUTTONDBLCLK:
break
;
}
break
;
case
WM_DESTROY:
Shell_NotifyIcon(NIM_DELETE, &nid);
PostQuitMessage(0);
break
;
case
WM_TIMER:
ShowTrayMsg();
KillTimer(hWnd, wParam);
break
;
}
if
(uMsg == WM_TASKBAR_CREATED)
{
Shell_NotifyIcon(NIM_ADD, &nid);
}
return
DefWindowProc(hWnd, uMsg, wParam, lParam);
}
int
WINAPI WinMain(
HINSTANCE
hInstance,
HINSTANCE
,
LPSTR
,
int
iCmdShow)
{
HWND
hWnd;
MSG msg;
WNDCLASS wc = { 0 };
wc.style = NULL;
wc.hIcon = NULL;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.lpfnWndProc = WndProc;
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = APP_NAME;
wc.hCursor = NULL;
if
(!RegisterClass(&wc))
return
0;
hWnd = CreateWindowEx(WS_EX_TOOLWINDOW, APP_NAME, APP_NAME, WS_POPUP, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
ShowWindow(hWnd, iCmdShow);
UpdateWindow(hWnd);
InitTray(hInstance, hWnd);
SetTimer(hWnd, 3, 1000, NULL);
while
(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return
msg.wParam;
}