vs2010 win32做成后台常驻和系统托盘
2026/5/22 22:02:01 网站建设 项目流程

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);
}
}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询