- 桌面应用
- 移动开发
- 开发工具
【免费下载链接】escrcpy
优雅而强大的跨平台 Android 设备控制工具,基于 Scrcpy 的 Electron 应用,支持无线连接和多设备管理,让您的电脑成为 Android 的完美伴侣。
Escrcpy 作为基于 Scrcpy 的跨平台 Android 设备控制工具,其底层会调用本机 scrcpy 二进制,并以命令行参数的形式传递镜像、录制等行为的控制指令。本文聚焦 scrcpy 的窗口控制参数族,系统讲解--no-window、--window-title、--window-x/y/width/height、--window-borderless、--always-on-top、--fullscreen与--disable-screensaver的语义与典型用法,并结合 escrcpy 仓库中的偏好模型(preference model)与进程封装源码,说明这些参数在图形界面中的落地方式。读完本文,你将掌握"纯录制无窗口"、"自定义窗口标题"、"精确摆放多设备窗口"、"无边框置顶小窗"等实战方案。
一、窗口控制参数的全局认识
窗口相关参数全部以--前缀的命令行选项形式传给 scrcpy 进程。在 escrcpy 中,这些参数并非直接硬编码在源码里,而是由一套"偏好模型 → 序列化 → 命令行拼接"的管线统一管理:
- 参数声明位于 desktop/src/models/preference/window/index.js,每个参数都声明了对应的
field(即 scrcpy 命令行选项名)、控件类型与默认值; - 参数序列化与拼接逻辑位于 desktop/src/store/preference/index.js 的
scrcpyParameter函数; - 最终进程启动时由 desktop/electron/middleware/scrcpy/index.js 拼装完整命令并交给 shell 执行。
因此,命令行上的每一个窗口参数,在 escrcpy 中都有对应的图形化配置项,二者一一对应。下面逐一展开。
二、禁用窗口显示:--no-window
命令行用法
如需禁用窗口显示(适用于仅需录制或播放音频的场景):
scrcpy --no-window --record=file.mp4 # 按Ctrl+C终止录制--no-window会让 scrcpy 完全不创建渲染窗口,视频流照常从设备拉取。搭配--record时可以"默默"录屏;只保留--no-window而不录制时,则相当于无头运行,适合后台任务。注意:启用--no-window后,窗口标题、位置、尺寸、全屏、无边框等窗口相关选项都会被忽略,因为它们没有承载目标。
在 escrcpy 中的实现
escrcpy 的helper接口正是"无窗口模式"的典型实现。在 desktop/electron/middleware/scrcpy/index.js 中:
async function helper(serial, command = '', options = {}) { const stringCommand = commandHelper.stringify(command) return createScrcpyProcess( `--serial="${serial}" --no-window --no-video --no-audio ${stringCommand}`, { resolveOnReady: true, ...options }, ) }可以看到,无窗口辅助命令固定携带--no-window --no-video --no-audio,用于执行--list-apps、--list-displays、--list-cameras、--list-encoders等查询类操作(对应getAppList、getDisplayIds、getCameraList、getEncoders等接口),此时既不需要画面也不需要声音。而录制场景则走record接口,同样不依赖窗口:
async function record(serial, { title, args = '', savePath, ...options } = {}) { return createScrcpyProcess( `--serial="${serial}" --window-title="${title}" --record="${savePath}" ${args}`, options, ) }录制时仍会设置--window-title(因为默认情况下窗口仍存在),若只想静默录制,在 escrcpy 的偏好配置中关闭"显示窗口"类选项即可,或在 scrcpyAppend 扩展参数里手工追加--no-window。
三、窗口标题:--window-title
命令行用法
默认窗口标题为设备型号,可通过以下命令修改:
scrcpy --window-title='我的设备'--window-title接受任意字符串,含空格时务必用引号包裹。窗口标题只影响本地窗口栏展示,不会改变设备端任何内容。
在 escrcpy 中的实现
escrcpy 在启动镜像时会把"应用名 + 设备标签"拼成窗口标题。核心拼装逻辑在 desktop/src/hooks/use-start-app/index.js 的resolveScrcpyRuntime:
const title = `${appName}-${deviceStore.getLabel(deviceId, 'synergy')}`随后由 desktop/electron/middleware/scrcpy/index.js 的createMirrorProcess注入命令行:
function createMirrorProcess(serial, { title, args = '', ...options } = {}) { return createScrcpyProcess( `--serial="${serial}" --window-title="${title}" ${args}`, options, ) }注意--window-title的值在拼接时被双引号包裹,配合shell: true的 shell 调用方式(见同文件createScrcpyProcess),可以安全地容纳包含空格甚至中文的标题文本。设备标签来自 escrcpy 的"备注(remark)"功能,因此你给设备设置的别名会直接体现在镜像窗口标题上,多设备并存时一眼即可区分。
四、位置与尺寸:--window-x/y/width/height
命令行用法
可指定窗口初始位置和尺寸:
scrcpy --window-x=100 --window-y=100 --window-width=800 --window-height=600四个参数均以像素为单位:
| 参数 | 含义 | 典型值 |
|---|---|---|
--window-x | 窗口左上角的水平坐标 | 100 |
--window-y | 窗口左上角的垂直坐标 | 100 |
--window-width | 窗口初始宽度 | 800 |
--window-height | 窗口初始高度 | 600 |
这些参数只决定窗口的"初始"几何属性,窗口一旦被用户拖拽或缩放,后续位置以实际窗口状态为准。
在 escrcpy 中的实现
在偏好模型 desktop/src/models/preference/window/index.js 中,四个参数被声明为InputNumber数字输入框(默认隐藏,由更高级的功能驱动):
windowWidth: { field: '--window-width', type: 'InputNumber', ... }, windowHeight: { field: '--window-height', type: 'InputNumber', ... }, windowX: { field: '--window-x', type: 'InputNumber', ... }, windowY: { field: '--window-y', type: 'InputNumber', ... },四个参数在 escrcpy 中最重要的落地场景是窗口自动排列(Arrange)。相关逻辑位于 desktop/src/components/arrange-dialog/hooks/useLayoutManagement.js 与 useSaveLayout.js:每个设备的镜像窗口会被抽象成一个可拖拽的"widget",其矩形几何信息(realWidth/realHeight/realX/realY)在保存布局时写回--window-width、--window-height、--window-x、--window-y配置;useAutoArrange.js 的自动排列则直接按网格生成这四个参数。也就是说,你在 escrcpy 里拖好的多窗口布局,最终就是一组精确的--window-x/y/width/height。
序列化时有两个值得注意的细节(见 desktop/src/store/preference/index.js):
--window-y会被自动叠加系统标题栏高度:obj[key] = Number(value) + titleBarHeight.value,从而保证配置中的坐标与窗口实际可见区域对齐;- 一旦启用了
--flex-display(柔性显示),--window-width与--window-height会被删除,因为窗口尺寸改由显示内容动态决定。
此外,在 desktop/src/hooks/use-start-app/index.js 中,横屏启动时会交换宽高:
if (landscape) { const tempWindowWidth = mergedConfig['--window-width'] mergedConfig['--window-width'] = mergedConfig['--window-height'] mergedConfig['--window-height'] = tempWindowWidth }从源码结构看,这是为了让横屏场景下窗口初始尺寸与设备画面比例保持一致,避免出现大面积黑边。
五、无边框模式:--window-borderless
命令行用法
禁用窗口装饰边框:
scrcpy --window-borderless开启后窗口不再显示标题栏与系统边框(不同桌面环境下窗口管理器行为略有差异),适合希望画面"悬浮"在桌面上的场景。通常与置顶、位置参数组合使用,可拼出一个无边框小窗。
在 escrcpy 中的实现
偏好模型将其声明为Switch开关(desktop/src/models/preference/window/index.js):
windowBorderless: { field: '--window-borderless', type: 'Switch', unset: [false], ... }unset: [false]的含义值得说明:在 escrcpy 的偏好序列化中,undefined、null、''以及字段声明的额外unset值都会被视作"未设置"而跳过(见 desktop/src/store/preference/helpers/index.js)。因此开关关闭(false)时该参数不会出现在命令行中——这符合"开关类选项只在开启时才需要传递"的直觉。
六、窗口置顶:--always-on-top
命令行用法
保持窗口始终在最前端显示:
scrcpy --always-on-top置顶后窗口会悬浮在其他应用之上,适合边看视频边操作、对照文档调试设备等场景。
在 escrcpy 中的实现
与无边框一致,该参数在偏好模型中同样是Switch开关(desktop/src/models/preference/window/index.js),开启后序列化为--always-on-top。
一个更有意思的实现事实是:escrcpy 的OTG(有线直连)模式会强制置顶。在 desktop/src/hooks/use-otg-action/index.js 中,OTG 启动时会以overrides覆盖配置:
const args = preferenceStore.scrcpyParameter(deviceId, { overrides: { '--no-video': true, '--no-audio': true, '--always-on-top': true, '--mouse': 'uhid', '--keyboard': 'uhid', }, excludes: ['--turn-screen-off', ...], })OTG 模式下 scrcpy 只负责输入注入(--mouse/--keyboard使用 uhid 协议),画面由设备自身屏幕承担,因此窗口仅是一个常驻置顶的控制浮层——--always-on-top: true正是为了保证这个浮层始终可见、可操作。
七、全屏模式:--fullscreen
命令行用法
直接以全屏模式启动:
scrcpy --fullscreen scrcpy -f # 简写形式全屏模式可通过快捷键MOD+f动态切换(参见快捷键说明)。这里的MOD是快捷键修饰键,默认为(左)Alt或(左)Super(Windows/Cmd),可用--shortcut-mod改为lctrl、rctrl、lalt、ralt、lsuper、rsuper。因此"启动即全屏 + 运行中切换"是两种互补的用法:前者用--fullscreen预设状态,后者用MOD+f随时进出全屏。
在 escrcpy 中的实现
偏好模型中(desktop/src/models/preference/window/index.js):
fullscreen: { field: '--fullscreen', type: 'Switch', unset: [false], ... }开启后每次启动镜像都会带上--fullscreen,满足"打开即全屏"的需求;需要中途切换时,仍可在镜像窗口内使用 scrcpy 自带的快捷键完成,无需重启。
八、禁用屏幕保护:--disable-screensaver
命令行用法
默认情况下,scrcpy不会阻止计算机进入屏幕保护状态。如需禁用:
scrcpy --disable-screensaver该选项防止镜像过程中宿主机进入屏保或锁屏,适合长时间演示、直播投屏、无人值守的录制任务。它与设备端熄屏(--turn-screen-off)是两个独立概念:本选项控制的是电脑的屏保,而设备端熄屏仍可通过快捷键MOD+o单独控制。
在 escrcpy 中的实现
同样是Switch开关(desktop/src/models/preference/window/index.js),开启后序列化为--disable-screensaver。在 escrcpy 的"偏好设置 → 窗口"分组中打开对应开关即可,无需手工拼命令。
九、补充:背景色--background-color
偏好模型中还有一个与窗口观感直接相关的参数——backgroundColor(desktop/src/models/preference/window/index.js):
backgroundColor: { field: '--background-color', type: 'ColorPicker', ... }它对应 scrcpy 的--background-color选项,用于指定窗口背景颜色,默认值为黑色。当窗口比例与设备画面比例不一致、出现黑边时,该参数决定黑边区域的颜色,常配合窗口尺寸一起调整观感。escrcpy 中它以取色器(ColorPicker)形式暴露,选择后同样经scrcpyParameter序列化为命令行参数。
十、从界面到命令行的完整链路
把以上各节串起来,escrcpy 中一次窗口参数生效的完整链路是:
- 声明:参数在 desktop/src/models/preference/window/index.js 中声明
field(选项名)、控件类型、unset语义; - 存储:用户在偏好界面(或自动排列、OTG 等模块)写入配置,按
global或具体设备scope持久化(见 desktop/src/store/preference/index.js 的getDataWithFallback:设备配置未设置时回退到全局配置); - 序列化:
scrcpyParameter(desktop/src/store/preference/index.js)过滤掉undefined/null/''/false与声明为unset的值,处理--window-y标题栏补偿、--flex-display冲突,再拼接成参数字符串; - 拼装:desktop/electron/middleware/scrcpy/index.js 的
createMirrorProcess等函数把--serial、--window-title与上述参数合并; - 执行:经
sheller以 shell 方式启动 scrcpy 进程,并由ProcessManager统一管理生命周期(退出时kill)。
理解了这条链路,你就既能直接在命令行使用 scrcpy 原生命令,也能在 escrcpy 图形界面里精确复现同样的效果,还能通过偏好配置中的附加参数(scrcpyAppend)注入任意未内置的 scrcpy 选项,例如--window-title的更多玩法或自定义窗口图标等,实现 CLI 与 GUI 的无缝互补。
相关文档
- 快捷键说明(全屏切换等 MOD 组合键)
- 窗口控制偏好模型定义
- scrcpy 参数序列化与拼接逻辑
- scrcpy 进程封装与命令拼装
- 窗口自动排列与布局保存
- OTG 模式强制置顶实现
- 桌面应用
- 移动开发
- 开发工具
【免费下载链接】escrcpy
优雅而强大的跨平台 Android 设备控制工具,基于 Scrcpy 的 Electron 应用,支持无线连接和多设备管理,让您的电脑成为 Android 的完美伴侣。
相关推荐
escrcpy 窗口控制完全指南:scrcpy 窗口显示、尺寸、全屏与置顶参数详解
escrcpy 窗口控制完全指南:scrcpy 窗口显示、尺寸、全屏与置顶参数详解 本文以 escrcpy 项目的 scrcpy 窗口控制功能为主线,系统讲解
桌面应用移动开发Escrcpy 窗口控制完全指南:从标题、尺寸到全屏与无头录制的 Scrcpy 窗口参数详解
Escrcpy 窗口控制完全指南:从标题、尺寸到全屏与无头录制的 Scrcpy 窗口参数详解 导读 :本文围绕 Escrcpy 项目文档中关于 Scrcpy 窗
桌面应用移动开发开发工具scrcpy 窗口控制完全指南:从无头录制到全屏投屏的 Escrcpy 实战
scrcpy 窗口控制完全指南:从无头录制到全屏投屏的 Escrcpy 实战 本指南以 Escrcpy 仓库 docs/en/reference/scrcpy/
桌面应用移动开发
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考