# 单实例锁问题修复说明

## 问题描述
运行 `npm run dev` 时，程序检测到已有实例运行并退出，但任务管理器中并没有看到已启动的实例：
```
13:05:39.374 > 单实例锁检查结果: false
13:05:39.375 > 检测到已有实例运行，退出当前实例
Process finished with exit code 0
```

## 问题原因分析
1. **锁文件未正确清理**：之前的实例异常退出时，单实例锁文件没有被正确删除
2. **进程检查不完善**：只检查了锁文件存在，没有验证对应的进程是否还在运行
3. **锁文件位置不明确**：Electron 的单实例锁可能存储在不同位置
4. **异常退出处理不当**：应用崩溃或强制关闭时，锁文件没有被清理

## 修复内容

### 1. 创建单实例锁管理工具 (`src/main/utils/singleInstance.js`)
- 提供完整的锁文件管理功能
- 自动清理无效的锁文件
- 检查进程是否还在运行
- 在应用退出时自动清理锁文件

### 2. 改进单实例检查逻辑 (`src/main/index.js`)
- 使用新的单实例管理器
- 在启动时自动清理无效锁文件
- 如果找不到现有实例窗口，允许强制启动
- 添加详细的日志记录

### 3. 添加手动清理功能 (`src/main/tray.js`)
- 在托盘菜单中添加"清理实例锁"选项
- 允许用户手动清理锁文件
- 提供清理结果反馈

### 4. 创建测试脚本 (`test-single-instance.js`)
- 提供锁文件检查和清理的测试功能
- 验证进程检查逻辑
- 帮助调试锁文件问题

## 修复后的功能特点

### 自动锁文件管理
1. **启动时检查**：应用启动时自动检查并清理无效锁文件
2. **进程验证**：验证锁文件中的进程是否还在运行
3. **自动清理**：应用正常退出时自动清理锁文件
4. **异常处理**：监听各种退出信号，确保锁文件被清理

### 手动清理功能
1. **托盘菜单**：右键点击托盘图标，选择"清理实例锁"
2. **批量清理**：清理多个可能的锁文件位置
3. **结果反馈**：显示清理的文件数量和结果

### 智能启动逻辑
1. **锁文件检查**：启动前检查锁文件有效性
2. **窗口激活**：如果找到现有实例，尝试激活其窗口
3. **强制启动**：如果找不到现有实例，允许强制启动
4. **详细日志**：记录每个步骤的执行情况

## 使用方法

### 自动修复
1. 重新运行 `npm run dev`
2. 应用会自动检查并清理无效锁文件
3. 如果清理成功，应用会正常启动

### 手动清理
1. 如果应用已经启动，右键点击托盘图标
2. 选择"清理实例锁"
3. 查看日志确认清理结果
4. 重新启动应用

### 测试锁文件
```bash
# 运行测试脚本
node test-single-instance.js
```

## 锁文件位置

### Windows 系统
- `%APPDATA%\[应用名称]\single-instance-lock`
- `%APPDATA%\[应用名称]\lockfile`
- `%APPDATA%\[应用名称]\.lock`

### macOS 系统
- `~/Library/Application Support/[应用名称]/single-instance-lock`
- `~/Library/Application Support/[应用名称]/lockfile`
- `~/Library/Application Support/[应用名称]/.lock`

### Linux 系统
- `~/.config/[应用名称]/single-instance-lock`
- `~/.config/[应用名称]/lockfile`
- `~/.config/[应用名称]/.lock`

## 验证修复效果

### 1. 正常启动
运行 `npm run dev` 后，应该看到：
```
[时间] 单实例锁检查结果: true
[时间] 这是第一个实例，继续启动
[时间] 应用已准备就绪，开始初始化...
```

### 2. 重复启动
如果尝试启动第二个实例，应该看到：
```
[时间] 单实例锁检查结果: false
[时间] 检测到已有实例运行，尝试激活现有实例
[时间] 成功激活现有实例窗口
```

### 3. 异常恢复
如果之前的实例异常退出，应该看到：
```
[时间] 发现锁文件: [路径]
[时间] 进程 [PID] 不存在，删除无效锁文件
[时间] 单实例锁检查结果: true
[时间] 这是第一个实例，继续启动
```

## 常见问题解决

### 1. 仍然无法启动
1. 手动清理锁文件：
   - 右键点击托盘图标 → 清理实例锁
   - 或者手动删除锁文件
2. 检查任务管理器，确保没有残留进程
3. 重启开发环境

### 2. 锁文件清理失败
1. 检查文件权限
2. 确保没有其他程序占用锁文件
3. 以管理员身份运行应用

### 3. 进程检查不准确
1. 在 Windows 上使用 `tasklist` 命令手动检查
2. 确认进程 ID 是否正确
3. 检查系统权限

## 注意事项

### 1. 开发环境
- 在开发过程中，锁文件可能会频繁创建和删除
- 如果遇到问题，使用托盘菜单的清理功能
- 查看日志文件获取详细信息

### 2. 生产环境
- 确保应用正常退出时能清理锁文件
- 监控锁文件的状态
- 定期检查是否有无效锁文件

### 3. 调试建议
- 使用 `test-single-instance.js` 脚本测试锁文件功能
- 查看日志文件了解锁文件的状态
- 使用托盘菜单的手动清理功能

## 相关文件
- `src/main/utils/singleInstance.js` - 单实例锁管理工具
- `src/main/index.js` - 主进程启动文件（已更新）
- `src/main/tray.js` - 托盘功能（已更新）
- `test-single-instance.js` - 锁文件测试脚本 