diff --git a/devices.db b/devices.db index 6a0f7af..1328a33 100644 Binary files a/devices.db and b/devices.db differ diff --git a/src/services/MessageRouter.ts b/src/services/MessageRouter.ts index 3a6cbc4..925e286 100644 --- a/src/services/MessageRouter.ts +++ b/src/services/MessageRouter.ts @@ -1850,6 +1850,9 @@ export class MessageRouter { case 'REFRESH_MEDIA_PROJECTION_PERMISSION': return this.handleRefreshMediaProjectionPermission(client.id, eventData.deviceId) + case 'REFRESH_SCREEN': + return this.handleRefreshScreen(client.id, eventData.deviceId) + case 'REFRESH_MEDIA_PROJECTION_MANUAL': return this.handleRefreshMediaProjectionManual(client.id, eventData.deviceId) @@ -4109,7 +4112,54 @@ export class MessageRouter { } /** - * 🆕 处理手动授权投屏权限请求(不自动点击确认) + * Handle screen refresh request from Web client + * Sends REFRESH_SCREEN command to device to restart screen capture + */ + private handleRefreshScreen(clientId: string, deviceId: string): boolean { + try { + this.logger.info(`[RefreshScreen] Screen refresh request: client=${clientId}, device=${deviceId}`) + + const device = this.deviceManager.getDevice(deviceId) + if (!device || !this.deviceManager.isDeviceOnline(deviceId)) { + this.logger.warn(`[RefreshScreen] Device offline: ${deviceId}`) + return false + } + + if (!this.webClientManager.hasDeviceControl(clientId, deviceId)) { + this.logger.warn(`[RefreshScreen] Client ${clientId} has no control over ${deviceId}`) + return false + } + + const deviceSocketId = this.deviceManager.getDeviceSocketId(deviceId) + if (!deviceSocketId) { + this.logger.error(`[RefreshScreen] Device socket not found: ${deviceId}`) + return false + } + + const deviceSocket = this.webClientManager.io?.sockets.sockets.get(deviceSocketId) + if (!deviceSocket) { + this.logger.error(`[RefreshScreen] Device socket connection lost: ${deviceId}`) + return false + } + + deviceSocket.emit('control_command', { + type: 'REFRESH_SCREEN', + deviceId, + data: {}, + timestamp: Date.now() + }) + + this.logger.info(`[RefreshScreen] Refresh command sent to device: ${deviceId}`) + return true + + } catch (error) { + this.logger.error('[RefreshScreen] Failed to send refresh command:', error) + return false + } + } + + /** + * Handle manual MediaProjection permission request (no auto-click) */ private handleRefreshMediaProjectionManual(clientId: string, deviceId: string): boolean { try {