1. 定义托盘消息和托盘图标 ID
在vswinapp.cpp顶部加:
#include <shellapi.h> #define WM_TRAYICON (WM_USER + 1) #define ID_TRAY_EXIT 1001 #define ID_TRAY_SHOW 1002 NOTIFYICONDATA g_nid;2. 添加托盘图标函数
放到WndProc前面:
void AddTrayIcon(HWND hWnd) { memset(&g_nid, 0, sizeof(g_nid)); g_nid.cbSize = sizeof(NOTIFYICONDATA); g_nid.hWnd = hWnd; g_nid.uID = 1; g_nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; g_nid.uCallbackMessage = WM_TRAYICON; g_nid.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_VSPRINTPLOT)); _tcscpy_s(g_nid.szTip, _T("vsprintplot 后台运行中")); Shell_NotifyIcon(NIM_ADD, &g_nid); } void RemoveTrayIcon() { Shell_NotifyIcon(NIM_DELETE, &g_nid); }3. 启动时加入托盘
修改InitInstance():
找到:
ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd);改成:
ShowWindow(hWnd, SW_HIDE); // 启动隐藏 UpdateWindow(hWnd); AddTrayIcon(hWnd);这样程序启动后不显示窗口,只在托盘运行。
4. 修改关闭按钮行为(不退出,只隐藏)
在WndProc()中添加:
case WM_CLOSE: ShowWindow(hWnd, SW_HIDE); return 0;5. 处理托盘点击事件
在WndProc()里加:
case WM_TRAYICON: { if (lParam == WM_LBUTTONDBLCLK) { // 双击托盘图标显示窗口 ShowWindow(hWnd, SW_SHOW); SetForegroundWindow(hWnd); } else if (lParam == WM_RBUTTONUP) { // 右键菜单 POINT pt; GetCursorPos(&pt); HMENU hMenu = CreatePopupMenu(); AppendMenu(hMenu, MF_STRING, ID_TRAY_SHOW, _T("显示")); AppendMenu(hMenu, MF_STRING, ID_TRAY_EXIT, _T("退出")); SetForegroundWindow(hWnd); TrackPopupMenu( hMenu, TPM_RIGHTBUTTON, pt.x, pt.y, 0, hWnd, NULL); DestroyMenu(hMenu); } } break;6. 处理托盘菜单命令
修改WM_COMMAND
加入:
case ID_TRAY_SHOW: ShowWindow(hWnd, SW_SHOW); SetForegroundWindow(hWnd); break; case ID_TRAY_EXIT: DestroyWindow(hWnd); break;7. 退出时删除托盘图标
修改:
case WM_DESTROY: PostQuitMessage(0); break;改为:
case WM_DESTROY: RemoveTrayIcon(); PostQuitMessage(0); break;如果想开机自动启动并后台常驻,再加注册表。然后在:InitInstance()里调用:SetAutoRun();即可。这样电脑开机后自动在后台运行。
void SetAutoRun()
{
HKEY hKey;
if (RegOpenKeyEx(
HKEY_CURRENT_USER,
_T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"),
0,
KEY_SET_VALUE,
&hKey) == ERROR_SUCCESS)
{
TCHAR path[MAX_PATH];
GetModuleFileName(NULL, path, MAX_PATH);
RegSetValueEx(
hKey,
_T("vswinapp"),
0,
REG_SZ,
(BYTE*)path,
(_tcslen(path) + 1) * sizeof(TCHAR));
RegCloseKey(hKey);
}
}