把手机浏览器变成电脑的远程输入终端,语音、触控板、常用按键都行

🗣️ 语音输入
豆包输入法 → 电脑
🖱️ 触控板
手机当鼠标用
📋 历史记录
点击回填,自动滚回顶部
语音输入主界面 触控板模式 历史记录

电脑上写长文,打字慢;手机上豆包输入法的语音识别很准,但识别出来的字还在手机上。躺在床上 AI Coding 切候选项,还得爬起来摸键盘。

Remote Input Board 把这件事倒过来:电脑上跑一个小服务,手机浏览器打开网页,手机就变成电脑的远程输入终端。语音输入直接打到光标位置,触控板当鼠标用,ESC、发送、清空这些常用按键也能在手机上操作。

项目地址:https://github.com/createskyblue/remote-input-board

能做什么

文本输入

触控板

常用按键

关键行为

怎么用

电脑端一行启动:

uv run python -m py_remote_input

终端打印局域网地址,手机连同一个 Wi-Fi 打开即可。发送前在电脑上点一下目标输入位置,把光标放好。

改端口:

$env:PORT='3219'; uv run python -m py_remote_input

打包成单个 exe(不需要 Python 环境):

.\.venv\Scripts\python.exe scripts\build_exe.py

输出 dist\RemoteInputBoard.exe,双击即用。

发送过的文本都写进 logs/input-history.log,一行一条 JSON,崩溃也不丢。

架构

整个项目只有两个运行时通道:

通道 用途 协议
HTTP API 文本发送、按键、鼠标点击等离散操作 HTTP POST JSON
WebSocket 鼠标移动、滚动等高频连续操作 WebSocket 文本帧 JSON

鼠标移动如果走 HTTP,每次 pointermove 发一个 POST 请求,延迟和开销都很大。走 WebSocket 后,前端用 requestAnimationFrame 攒帧合并增量,后端收到直接调 SendInput,体感跟手。

核心模块:

py_remote_input/
  __main__.py     # 入口
  server.py       # HTTP + WebSocket 服务,ThreadingHTTPServer
  web.py          # HTTP 路由和请求分发
  websocket.py    # WebSocket 帧编码/解码(无第三方依赖)
  typer.py        # Win32 SendInput 封装:文本、按键、鼠标移动/点击/滚动
  logger.py       # 结构化日志(同时输出 stdout 和文件)
  templates/
    index.html    # 单页前端(原生 JS,无框架)

typer.py 是整个电脑端的核心。文字输入走 KEYEVENTF_UNICODE,每个 UTF-16 码元生成一对 keydown/keyup 事件;回车和退格映射到虚拟键码;鼠标移动、点击、滚动各自拼装 MOUSEINPUT 结构体,统一通过 SendInput 批量注入。

server.py 用标准库 ThreadingHTTPServer,不依赖 Flask 或任何 Web 框架。WebSocket 升级握手、帧解析、掩码处理全在 websocket.py 里手写实现,代码不到 80 行。

前端是单个 HTML 文件,所有状态(自动发送开关、延时、历史记录、累计字数)存在 localStorage,不依赖服务端 session。

触控板手势状态机

触控板的 tap / double-tap / drag 判定不依赖浏览器 click 事件,完全在 pointerdown/move/up 里处理:

所有定时和状态管理都在前端完成,服务端只接收 mouseMovemouseScrollmouseClickmouseButton 四种标准化消息。

小结

这个工具的出发点一直没变:把手机上更好的输入能力借给电脑用。语音输入是起点,触控板和常用按键是后来发现同样顺手加上的。代码量不大,但恰好覆盖了"不想碰键盘"的几个高频场景。

本文由 AI 辅助生成,可能存在错误或遗漏,请以实际资料和官方文档为准。