QtScrcpy 按键映射:从零写一份键位脚本

按键映射不是简单的“改键”,而是把键盘事件换算成手机屏幕上的相对坐标点击。理解坐标系统之后,剩下的工作就是量位置、填参数、反复微调。本文按这个顺序讲。

基于 v4.2.1 整理 内容更新 2026-11-02 核对自官方 KeyMapDes_zh 文档与示例脚本

文件放在哪

映射文件是 JSON 格式,必须放在 QtScrcpy 安装目录下的 keymap 文件夹里,软件启动时会扫描该目录。文件名会作为映射名称出现在界面的下拉框中,新增或修改后重新选择一次即可生效。

仓库自带了几个示例:test.json 演示多点与拖拽,gameforpeace.json 是完整的射击游戏配置,tiktok.json 演示短视频场景。最省事的起点是复制一份改名,再逐步替换坐标与按键。

改之前先备份原文件。映射脚本是纯文本,改坏了不会影响软件本身,但会让人不知道哪一步出了问题。

坐标怎么算

所有坐标都是相对值:屏幕宽度和高度都按 1 计算,原点在左上角。以 1920×1080 的屏幕为例,x=0.5、y=0.5 对应像素坐标 (960,540)。

取坐标有两种快办法:在开发者选项里打开“显示指针位置”,屏幕上会叠加显示当前触摸点;或者直接在投屏窗口里用鼠标左键单击目标位置,控制台会打印该点的 pos,复制进 JSON 即可。

注意相对坐标依赖屏幕比例。同一份脚本换到 20:9 的机型上,纵向位置会明显偏移,所以脚本最好按机型与分辨率分别维护,而不是一份走天下。

一份最小可用的脚本

下面这份配置只做两件事:把 J 键映射为屏幕右下角的单击(开火),把 Q 键映射为左侧区域的连续两次点击(探头)。

{
  "switchKey": "Key_QuoteLeft",
  "keyMapNodes": [
    {
      "comment": "开火",
      "type": "KMT_CLICK",
      "key": "Key_J",
      "pos": { "x": 0.86, "y": 0.78 }
    },
    {
      "comment": "探头",
      "type": "KMT_CLICK_TWICE",
      "key": "Key_Q",
      "pos": { "x": 0.12, "y": 0.35 }
    }
  ]
}

switchKey 是普通模式与映射模式的切换键,默认是反引号键(Key_QuoteLeft)。进入游戏后要先按它开启映射,否则按键仍然按普通键盘输入处理,不会触发触摸。

key 使用 Qt 的键名枚举,常见的有 Key_W、Key_A、Key_Space、Key_Shift、Key_1。完整列表见 Qt 文档中 Qt::Key 的枚举定义。

五种节点类型

按操作形态选择节点类型
type模拟的动作必填参数典型用途
KMT_CLICK按下与抬起各一次触摸key、pos开火、跳跃、技能
KMT_CLICK_TWICE一次按键触发两次点击key、pos探头、切换武器
KMT_CLICK_MULTI按 clickNodes 的延迟与坐标连续点击key、clickNodes连招、固定序列
KMT_DRAG从起点拖到终点key、startPos、endPos滑屏、开镜、翻页
KMT_STEER_WHEEL四键控制的方向盘centerPos、四个方向键与偏移量FPS 移动摇杆

KMT_DRAG 还有两个可选参数:dragSpeed 控制拖动速度(0–1,默认 1.0,越大越快),startDelay 指定按下后等待多少毫秒再开始拖动。KMT_CLICK_MULTI 的 clickNodes 是一个数组,每项包含 delay(毫秒)与 pos。

方向盘映射需要四个方向键与四个偏移量配合,下面是从官方示例中摘出的结构:

{
  "comment": "方向盘",
  "type": "KMT_STEER_WHEEL",
  "centerPos": { "x": 0.16, "y": 0.75 },
  "leftOffset": 0.1,
  "rightOffset": 0.1,
  "upOffset": 0.27,
  "downOffset": 0.2,
  "leftKey": "Key_A",
  "rightKey": "Key_D",
  "upKey": "Key_W",
  "downKey": "Key_S"
}

偏移量是相对 centerPos 的位移比例,不是绝对坐标。上调 upOffset 会让“向前”拖得更远,人物移动速度的体感随之变化。

鼠标视角映射

射击类游戏需要把鼠标移动换算成手指拖动,用来转动视角。这段配置写在根节点的 mouseMoveMap 里:

{
  "switchKey": "Key_QuoteLeft",
  "mouseMoveMap": {
    "startPos": { "x": 0.57, "y": 0.26 },
    "speedRatioX": 3.25,
    "speedRatioY": 1.25,
    "speedRatio": 10
  },
  "keyMapNodes": []
}

startPos 是拖动的起始点,通常取屏幕右侧的空白区域。speedRatio 越大,灵敏度越低(官方文档要求大于 0.00225);speedRatioX 与 speedRatioY 分别控制横向与纵向灵敏度,最小值为 0.001。开启鼠标映射后,鼠标指针会被隐藏并限制在窗口内,按切换键退出映射模式即可恢复。

还有一个可选节点 smallEyes:按住指定键时,鼠标移动改为从 smallEyes.pos 起拖,松开后恢复原起点,用来模拟“小眼睛”观察四周。

调试与微调

  • 先确认处于映射模式:按一次 switchKey,界面状态会变化;没切换时按键不会触发触摸。
  • 坐标偏移时,用“显示指针位置”叠加层核对,不要凭肉眼估。
  • 一次只改一组坐标,改完立刻在目标界面验证,避免多处变动后无法定位问题。
  • 游戏更新 UI 后按钮位置会变,旧脚本需要重新量坐标,这不是脚本失效。
  • JSON 对逗号与引号很敏感,多一个尾逗号就会整份失效;保存前用编辑器的 JSON 校验功能检查。

常见问题

为什么按键完全没有反应?

先检查是否按了 switchKey 进入映射模式,再确认文件确实放在 keymap 目录、JSON 能被解析、key 使用的是 Qt 键名(如 Key_W 而不是 W)。三者任一不满足都不会触发。

映射文件可以跨机型共用吗?

不建议。坐标是相对值,屏幕比例不同会导致位置偏移;即使分辨率相同,游戏 UI 布局也可能随版本变化。按机型维护更稳。

按键名去哪里查?

官方文档指向 Qt 的 Qt::Key 枚举,键名写作 Key_A、Key_Space、Key_Shift 这种形式。文档地址见本页末尾的参考资料。

一份脚本能同时控制多台设备吗?

脚本本身可以复用,但坐标是否准确取决于每台设备的屏幕比例与游戏界面。多设备群控时建议先用同一型号、同一分辨率验证。

可视化工具

手写 JSON 适合精细控制,但量坐标比较费时。官方文档提到了两类辅助工具:QuickAssistant(项目作者提供的可视化按键工具)与社区项目 ScrcpyKeyMapper(基于 Web 的图形界面,可可视化创建映射、实时测试并导出 JSON)。

工具生成的文件仍然要放进 keymap 目录才生效。如果工具版本与 QtScrcpy 版本差距较大,导出后先对照本文的字段说明检查一遍。

映射调好之后,如果想同时管理多台设备,可以继续看功能页的群控说明;连接层面的问题则在故障排查里按现象查找。

还没装?先拿到当前版本

按键映射依赖客户端版本,v4.2.1 的 keymap 目录结构与本文一致。

查看全部版本