ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

scrcpy 快捷键完全指南:窗口操作、屏幕控制与剪贴板同步的底层实现解析

scrcpy 快捷键完全指南:窗口操作、屏幕控制与剪贴板同步的底层实现解析 scrcpy 快捷键完全指南窗口操作、屏幕控制与剪贴板同步的底层实现解析【免费下载链接】scrcpyDisplay and control your Android device项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpyscrcpy 的几乎所有窗口级操作都通过键盘与鼠标快捷键完成旋转显示、暂停镜像、切换全屏、控制音量、剪贴板同步、捏合缩放等均无需触摸设备即可完成。本文以官方快捷键清单为主体完整覆盖--shortcut-mod修饰键配置、全部快捷键动作表与重复按键规则并深入 scrcpy 源码中的按键分发逻辑input_manager.c解释每条快捷键背后的实现机制帮助你既会用快捷键又理解快捷键为何如此行为。快捷键修饰键MOD与--shortcut-mod配置在 scrcpy 窗口中执行动作时先按住修饰键shortcut modifier简称MOD再按对应按键。默认 MOD 是左 Alt或左 SuperSuper 键通常是 Windows 键或 Mac 的 Cmd 键。可以通过--shortcut-mod参数修改 MOD可取的键为lctrl、rctrl、lalt、ralt、lsuper、rsuper多个修饰键用英文逗号分隔表示满足其一即生效# 使用 RCtrl右 Ctrl作为快捷键修饰键 scrcpy --shortcut-modrctrl # 左 Ctrl 或左 Super 均可触发快捷键 scrcpy --shortcut-modlctrl,lsuper--help中对--shortcut-mod的官方说明见 cli.cSpecify the modifiers to use for scrcpy shortcuts. Possible keys are lctrl, rctrl, lalt, ralt, lsuper and rsuper. Several shortcut modifiers can be specified, separated by ,. For example, to use either LCtrl or LSuper for scrcpy shortcuts, pass lctrl,lsuper. Default is lalt,lsuper (left-Alt or left-Super).注意组合如lctrllshift在早期版本已不再支持——cli.c 中的解析函数parse_shortcut_mods_item遇到含的项会直接报错退出。源码中的修饰键解析修饰键在源码中用位掩码表示定义于 options.henum sc_shortcut_mod { SC_SHORTCUT_MOD_LCTRL 1 0, SC_SHORTCUT_MOD_RCTRL 1 1, SC_SHORTCUT_MOD_LALT 1 2, SC_SHORTCUT_MOD_RALT 1 3, SC_SHORTCUT_MOD_LSUPER 1 4, SC_SHORTCUT_MOD_RSUPER 1 5, };默认值同样在 options.c 中写死为SC_SHORTCUT_MOD_LALT | SC_SHORTCUT_MOD_LSUPER。命令行字符串经 cli.c 中的 parse_shortcut_mods 按逗号切分、逐项与六个合法名称精确比对再按位或OR成单个uint8_t。该函数在SC_TEST编译模式下还会通过 test_cli.c 对应的单元测试sc_parse_shortcut_mods暴露验证。随后 shortcut_mod.h 中的sc_shortcut_mods_to_sdl把自定义掩码转换成 SDL 修饰键位KMOD_LCTRL、KMOD_LALT等供后续事件循环使用。完整快捷键动作表以下表格完整继承自官方文档 shortcuts.md。MOD表示当前生效的快捷键修饰键默认左 Alt 或左 Super动作快捷键切换全屏MODf逆时针旋转显示MOD←顺时针旋转显示MOD→水平翻转显示MODShift←或MODShift→垂直翻转显示MODShift↑或MODShift↓暂停 / 再次暂停显示MODz取消暂停显示MODShiftz重置视频捕获/编码MODShiftr窗口缩放至 1:1像素级精确MODg窗口缩放至消除黑边MODw或 黑边处双击¹点击HOMEMODh或 中键单击点击BACKMODb或MODBackspace或 右键²点击APP_SWITCH最近任务MODs或 4 号鼠标键³点击MENU解锁屏幕⁴MODm点击VOLUME_UPMOD↑点击VOLUME_DOWNMOD↓点击POWERMODp点亮屏幕右键²熄灭设备屏幕保持镜像MODo点亮设备屏幕MODShifto旋转设备屏幕MODr展开通知面板MODn或 5 号鼠标键³展开设置面板MODnn重复按 n或 5 号键双击³收起所有面板MODShiftn从设备复制到剪贴板⁵MODc从设备剪切到剪贴板⁵MODx同步剪贴板并粘贴⁵MODv注入计算机剪贴板文本MODShiftv打开硬键盘设置仅限 HID 键盘模式MODk开启/关闭 FPS 计数输出到 stdoutMODi捏合缩放/旋转Ctrl按住鼠标移动垂直倾斜两指竖滑Shift按住鼠标移动水平倾斜两指横滑CtrlShift按住鼠标移动拖放 APK 文件到窗口从计算机安装 APK拖放非 APK 文件到窗口推送文件到设备脚注说明与原文档一致双击黑边区域同样可消除黑边等价于MODw。右键的行为是条件性的若屏幕处于熄灭状态右键先点亮屏幕否则按下 BACK 键。第 4、5 号鼠标按键侧键如果你的鼠标有的话。对于开发中的 React Native 应用MENU会触发开发菜单。剪贴板相关快捷键仅适用于 Android 7 及以上版本。按键分发核心input_manager.c 的 sc_input_manager_process_key上表中每一条MODkey快捷键都汇聚到 input_manager.c 的 sc_input_manager_process_key。其判定流程值得细读修饰键匹配从 SDL 按键事件中取出mod当前修饰键状态与sdl_keycode调用sc_shortcut_mods_is_shortcut_mod(mods, mod)判断当前按住的是否是配置的 MODsc_shortcut_mods_is_shortcut_key(mods, sdl_keycode)补充处理正在按下 MOD 键本身的边界情况此时mod为 0但 keycode 仍是修饰键。按下且非系统重复时统计 key_repeatSDL_KEYDOWN事件若与上一次按键keycode 与 mod 都相同重复则key_repeat自增——这正是重复按键类快捷键如MODnn的实现基础。命中快捷键则进入大 switch 分发否则把按键转换为 scrcpy 内部 keycode/scancode 事件交给键盘处理器SDK 键盘或 HID 键盘转发给设备。以几个代表性分支为例MODo/MODShifto屏幕开关case SDLK_o分支调用set_display_power(im, on)发送SC_CONTROL_MSG_TYPE_SET_DISPLAY_POWER控制消息on shift即是否按住 Shift 决定开或关input_manager.c#L209-L220。这与--turn-screen-off命令行选项启动即熄屏见 cli.c属于同一套显示电源控制。MODz暂停case SDLK_z分支调用sc_screen_set_paused(im-screen, !shift)——注意这里是!shift不带 Shift 时暂停带 Shift 时取消暂停一个分支覆盖暂停与解暂停两条文档快捷键。方向键MOD←/→不带 Shift 时调用apply_orientation_transform施加SC_ORIENTATION_270/SC_ORIENTATION_90旋转显示加 Shift 则施加SC_ORIENTATION_FLIP_0水平翻转。MOD↑/↓不加 Shift 且未暂停时发送VOLUME_UP/VOLUME_DOWN键码且源码注释明确forward repeated events——音量键支持按键重复以连续调节音量。MODn通知/设置面板这是重复按键机制的典型使用者。case SDLK_n分支中shift时收起面板否则若key_repeat 0发送EXPAND_NOTIFICATION_PANELkey_repeat 0则发送EXPAND_SETTINGS_PANELinput_manager.c#L528-L538。剪贴板MODc/x发送GET_CLIPBOARD消息并携带SC_COPY_KEY_COPY/SC_COPY_KEY_CUTMODv走set_device_clipboard(im, true, ...)写入设备剪贴板并粘贴MODShiftv走clipboard_paste直接把剪贴板文本作为INJECT_TEXT输入事件注入不经过设备剪贴板。暂停状态对快捷键的影响从源码分支条件可以清楚看出各快捷键的生效前提这解释了使用中的常见快捷键失效现象按键注入类h、b、s、m、p、c、x等要求!paused——画面暂停时MODz后这些控制类快捷键被忽略窗口类f、w、g、i、方向键旋转只要求video有视频流暂停时仍可调整窗口o、n、r只要求control存在控制通道且未暂停。此外文本输入前也做了防串扰sc_input_manager_process_text_input中若检测到当前修饰键属于 MOD直接丢弃该文本事件保证快捷键组合绝不会意外输入字符input_manager.c#L312-L331。鼠标类快捷键与虚拟手指鼠标相关的三条特殊规则右键、4/5 号键、双击黑边以及 Ctrl/Shift 拖拽手势都在 sc_input_manager_process_mouse_button 中实现。鼠标按键绑定右键/中键/4 号键/5 号键的默认行为是可配置的默认值为SC_MOUSE_BINDING_AUTO见 options.cAUTO 在运行时按文档表自动展开右键→BACK或点亮屏幕、中键→HOME、4 号键→APP_SWITCH、5 号键→展开通知面板。绑定在 input_manager.h 的sc_mouse_bindings中分为pri不带 Shift与sec带 Shift两套按下 Shift 时切换使用哪一套绑定。几个实现细节右键的智能行为SC_MOUSE_BINDING_BACK分支调用press_back_or_turn_screen_on发送SC_CONTROL_MSG_TYPE_BACK_OR_SCREEN_ON消息input_manager.c#L106-L122由设备端判断屏幕是否熄灭——这正是文档脚注 2 右键在屏幕熄灭时点亮屏幕否则按 BACK 的实现。5 号键单击/双击区分面板SC_MOUSE_BINDING_EXPAND_NOTIFICATION_PANEL分支检查event-clicks小于 2 次单击发EXPAND_NOTIFICATION_PANEL双击则发EXPAND_SETTINGS_PANELinput_manager.c#L770-L778。双击黑边消除黑边左键双击时若点击坐标落在screen-rect画面矩形之外则调用sc_screen_resize_to_fit与MODw等价input_manager.c#L785-L802。捏合缩放与倾斜虚拟手指原理Ctrl按住左键拖动可模拟两指捏合缩放/旋转、Shift拖动模拟两指竖滑垂直倾斜、CtrlShift拖动模拟两指横滑水平倾斜。其原理是虚拟手指virtual finger按住修饰键并按下左键时除了鼠标本身的触控事件外客户端还会在屏幕中心对称点生成第二根手指SC_POINTER_ID_GENERIC_FINGER的事件通过simulate_virtual_finger发送SC_CONTROL_MSG_TYPE_INJECT_TOUCH_EVENT。对称轴的选择由修饰键决定源码中的真值表注释input_manager.c#L856-L869CtrlShiftinvert_xinvert_y手势00--普通单击0110垂直倾斜沿垂直轴对称1011旋转/缩放屏幕中心对称1101水平倾斜沿水平轴对称拖动过程中每帧都会用inverse_point计算对称坐标再发ACTION_MOVE两指位置镜像联动从而在设备端产生真实的双指手势。拖放文件把文件拖到 scrcpy 窗口时触发SDL_DROPFILE事件sc_input_manager_process_file 用扩展名判断.apk走SC_FILE_PUSHER_ACTION_INSTALL_APK推送后执行安装其他文件走SC_FILE_PUSHER_ACTION_PUSH_FILE推送到设备。推送的目标路径可通过--push-target指定例如scrcpy --push-target/sdcard/Movies/详细说明见 control.md 的 File drop 章节。重复按键规则与 Ctrl 按键转发约定含重复键的快捷键如何触发源码中的key_repeat统计每次按下 MOD 不放的条件下松开某键再按下同一键被视作一次新的SDL_KEYDOWN意味着重复键必须通过松开-再按完成单纯按住不放系统自动重复repeat1事件会被!repeat条件过滤。官方文档给出的标准操作步骤以展开设置面板MODnn为例按住MOD不放双击n按下、松开、再按下最后松开MOD。Ctrlkey 总是转发给设备文档最后一句约定所有Ctrlkey组合都会转发给设备由活动应用处理。结合源码看Ctrl不在 MOD 默认集合内除非你显式配置--shortcut-modlctrl等因此is_shortcut判定失败按键走常规键盘处理路径被注入设备。这也意味着如果你想用 Ctrl 做 MOD需要接受它与应用内快捷键转发的冲突权衡——这正是默认选择 Alt/Super 的原因。小结MOD 默认为左 Alt / 左 Super通过--shortcut-mod用逗号分隔的列表自定义合法值仅lctrl/rctrl/lalt/ralt/lsuper/rsuper六个cli.c全部窗口控制与设备控制快捷键统一由 input_manager.c 分发按键类注入 Android keycode 或发送控制消息窗口类操作本地 SDL 窗口鼠标类通过虚拟手指合成双指手势记住两个使用约束暂停MODz期间控制类按键快捷键失效窗口类快捷键仍可用所有Ctrlkey会转发到设备应用因此 Ctrl 不宜与 MOD 混用。【免费下载链接】scrcpyDisplay and control your Android device项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表