当前位置: 首页 > article >正文

Electron 后台常驻服务实现(托盘 + 开机自启)

基于 electron-vite-vue 项目结构

本篇将详细介绍如何为 Electron 应用实现后台常驻运行,包括:

  • ✅ 创建系统托盘图标(Tray)
  • ✅ 支持点击托盘菜单控制窗口显示/退出
  • ✅ 实现开机自启功能(Auto Launch)

📁 项目结构建议

electron-vite-vue/
├── electron/
│   ├── main/
│   │   ├── index.ts        # 主进程入口
│   │   ├── tray.ts         # 托盘功能实现
│   │   └── autostart.ts    # 开机启动功能
├── resources/
│   └── iconTemplate.png    # 托盘图标
├── src/
│   └── App.vue
└── package.json

🖼️ 1. 托盘功能实现(electron/main/tray.ts)

import { Tray, Menu, BrowserWindow, nativeImage, app } from 'electron'
import path from 'path'let tray: Tray | null = nullexport function createTray(win: BrowserWindow) {const icon = nativeImage.createFromPath(path.join(__dirname, '../../resources/iconTemplate.png'))icon.setTemplateImage(true) // macOS 支持暗黑模式适配tray = new Tray(icon)tray.setToolTip('我的 Electron 应用')const contextMenu = Menu.buildFromTemplate([{ label: '显示窗口', click: () => win.show() },{ label: '退出', click: () => { app.quit() } }])tray.setContextMenu(contextMenu)tray.on('click', () => {win.isVisible() ? win.hide() : win.show()})tray.on('double-click', () => {win.show()})
}

🧩 2. 主窗口关闭时隐藏到托盘(electron/main/index.ts)

mainWindow.on('close', (e) => {if (!app.isQuiting) {e.preventDefault()mainWindow.hide()}
})

⚙️ 3. 开机启动功能(electron/main/autostart.ts)

import { app } from 'electron'export function enableAutoLaunch() {app.setLoginItemSettings({openAtLogin: true,path: app.getPath('exe') // 自动获取应用路径})
}

Windows/macOS 默认支持。Linux 需要创建 .desktop 文件或使用 auto-launch 库。


🔗 4. 在主进程入口中调用(electron/main/index.ts)

import { enableAutoLaunch } from './autostart'
import { createTray } from './tray'app.whenReady().then(() => {mainWindow = createWindow()enableAutoLaunch()createTray(mainWindow)
})

🧪 注意事项(平台兼容)

功能WindowsmacOSLinux
托盘✅ 完全支持✅ 支持(建议使用 Template 图标)⚠️ 依赖桌面环境
开机自启✅(需签名或添加权限)⚠️ 建议用 auto-launch

✅ 效果总结

功能项效果说明
托盘交互支持点击/双击托盘控制窗口
窗口关闭不退出程序,仅隐藏
托盘菜单显示主界面 / 退出程序
开机自启系统启动时自动运行 Electron 应用

📚 推荐阅读

  • Electron 官方 Tray 文档
  • Electron 开机启动说明
  • electron-vite-vue 模板
http://www.lryc.cn/news/2385125.html

相关文章:

  • Spring Boot与Kafka集成实践:从入门到实战
  • 人形机器人通过观看视频学习人类动作的技术可行性与前景展望
  • 第三十四天打卡
  • 打卡day35
  • 【【嵌入式开发 Linux 常用命令系列 19 -- linux top 命令的交互使用介绍】
  • 配置tomcat时,无法部署工件该怎么办?
  • .NET外挂系列:8. harmony 的IL编织 Transpiler
  • 基于netty实现视频流式传输和多线程传输
  • 全面指南:使用Node.js和Python连接与操作MongoDB
  • 游戏引擎学习第308天:调试循环检测
  • Java 海康录像机通过sdk下载的视频无法在线预览问题
  • WPF性能优化之延迟加载(解决页面卡顿问题)
  • 移植 FART 到 Android 10 实现自动化脱壳
  • ES的Refresh、Flush、Merge操作对性能的影响? ES如何实现近实时(NRT)搜索? ES聚合查询的Terms和Cardinality区别?
  • WebXR 虚拟现实开发
  • COMPUTEX 2025 | 广和通创新解决方案共筑AI交互新纪元
  • 了解Android studio 初学者零基础推荐(3)
  • Spring 定时器和异步线程池 实践指南
  • 零基础设计模式——创建型模式 - 生成器模式
  • MD编辑器推荐【Obsidian】含下载安装和实用教程
  • LLama-Factory 遇到的问题
  • I-CON: A UNIFYING FRAMEWORK FOR REPRESENTATION LEARNING
  • Missashe线代题型总结
  • 蓝桥杯13届 卡牌
  • 安卓开发用到的设计模式(1)创建型模式
  • 【PalladiumZ2 使用专栏 3 -- 信号值的获取与设置 及 memory dump 与 memory load】
  • flutter dart 函数语法
  • 课外活动:大语言模型Claude的技术解析 与 自动化测试框架领域应用实践
  • 线程的一些基本知识
  • 【Python打卡Day30】模块与包的导入@浙大疏锦行