const { spawn } = require('child_process') const { execSync } = require('child_process') const path = require('path') const fs = require('fs') const config = require(path.join(__dirname, '..', '..', 'configs', 'config.js')) const projectRoot = path.resolve(__dirname, '..', '..') const adbPath = path.resolve(projectRoot, config.adbPath.path) const scrcpyDir = path.dirname(adbPath) const scrcpyPath = path.join(scrcpyDir, 'scrcpy.exe') const scrcpyVbs = path.join(scrcpyDir, 'scrcpy-noconsole.vbs') const stopBat = path.join(scrcpyDir, 'stop.bat') const pidFile = path.join(projectRoot, 'static', 'scrcpy-pid.json') const action = process.argv[2] const pidArg = process.argv[3] // 获取 scrcpy 进程 PID function getScrcpyPid() { const output = execSync(`tasklist /FI "IMAGENAME eq scrcpy.exe" /FO CSV`, { encoding: 'utf-8' }) const lines = output.split('\n').filter(line => line.includes('scrcpy.exe')) if (lines.length === 0) { return null } const pidMatch = lines[0].match(/"(\d+)"/) if (!pidMatch) { return null } return parseInt(pidMatch[1]) } // 检查并终止指定 PID 的进程 function killPidIfRunning(pid) { spawn('taskkill.exe', ['/F', '/PID', pid.toString()], { stdio: 'ignore', detached: true }).unref() } // 启动 scrcpy function startScrcpy() { const targetPid = pidArg && /^\d+$/.test(pidArg) ? parseInt(pidArg) : 7788 killPidIfRunning(targetPid) const vbsArgs = pidArg && !/^\d+$/.test(pidArg) ? ` "${pidArg}"` : '' execSync(`wscript.exe "${scrcpyVbs}"${vbsArgs}`, { cwd: scrcpyDir, stdio: 'ignore' }) const sleep = (ms) => { const start = Date.now() while (Date.now() - start < ms) {} } sleep(2000) const runningPid = getScrcpyPid() if (!runningPid) { console.log(JSON.stringify({ success: false, error: 'Failed to start scrcpy' })) process.exit(1) return } fs.writeFileSync(pidFile, JSON.stringify({ pid: runningPid }), 'utf-8') console.log(JSON.stringify({ success: true, pid: runningPid })) process.exit(0) } // 停止 scrcpy function stopScrcpy() { const pid = JSON.parse(fs.readFileSync(pidFile, 'utf-8')).pid execSync(`"${stopBat}" ${pid}`, { stdio: 'ignore', cwd: scrcpyDir }) fs.unlinkSync(pidFile) console.log(JSON.stringify({ success: true })) process.exit(0) } switch (action) { case 'start': startScrcpy() break case 'stop': stopScrcpy() break default: console.log(JSON.stringify({ success: false, error: 'Usage: node screenshot.js [start|stop] [pid|deviceIp]' })) process.exit(1) }