# PhoneType **Repository Path**: kuwx/PhoneType ## Basic Information - **Project Name**: PhoneType - **Description**: Mobile typing, auto-input to PC. Android app + Windows tray + relay server. - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-11-11 - **Last Updated**: 2026-11-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PhoneType 手机打字,自动输入到电脑。 很多台式机没有麦克风,装了语音输入法也用不上。PhoneType 让你把手机当作电脑的"无线麦克风 + 键盘":在手机 APP 的输入框里用任意输入法(包括微信输入法的语音转文字)说话,文字会自动出现在电脑当前光标所在的位置。 - **电脑端**:Windows 托盘程序,常驻后台、开机自启,收到文字后直接注入到当前焦点窗口 - **手机端**:Android APP,一个输入框,打完字停顿一下自动发送 - **网络**:局域网直连(自动发现,无需配置 IP)或外网中继(跨网络使用) ## 功能特性 - **只要一个功能**:手机输入 → 电脑光标处输出,没有多余的东西 - **扫码连接(外网)**:电脑端显示二维码,手机扫一下自动填好中继地址、房间号和配对码 - **不依赖无障碍权限**:APP 只需要网络和相机权限,装上就能用 - **不污染剪贴板**:通过 `SendInput` + `KEYEVENTF_UNICODE` 逐字符注入,你复制的内容不会被覆盖 - **自动发现**:同一 WiFi 下点"自动发现电脑"即可,不用手动查 IP - **开机自启**:电脑端写注册表 `HKCU\...\Run`,手机端监听 `BOOT_COMPLETED` - **断线自动重连**:指数退避,网络恢复后自动接上 - **内网穿透可选**:不在同一网段时,用内置的 TCP 中继服务器转发 ## 工作原理 ``` ┌─────────────┐ TCP 17321 ┌──────────────┐ SendInput ┌────────────┐ │ Android │ ───────────────► │ Windows │ ────────────► │ 当前焦点 │ │ 输入框 │ 换行分隔 JSON │ 托盘程序 │ Unicode │ 输入窗口 │ └─────────────┘ └──────────────┘ └────────────┘ │ ▲ │ 不在同一网段时 │ └──────► TCP 中继 (8787) ─────────┘ ``` 手机端监听输入框的 `TextWatcher`,停顿 800ms 后把**新增的那部分文字**发出去;电脑端收到后按 Unicode 逐字注入,任何支持文本输入的窗口都能接住。 ## 目录结构 ``` . ├── android/ Android APP(Kotlin,零第三方依赖) │ └── app/src/main/ │ ├── java/com/phonetype/app/ │ │ ├── MainActivity.kt 输入框、配对、自动发现 │ │ ├── SyncService.kt 前台服务、TCP 长连接、心跳重连 │ │ ├── SyncState.kt 连接状态 │ │ ├── Prefs.kt 配置存储 │ │ └── BootReceiver.kt 开机自启 │ └── res/ ├── pc/PhoneType.Pc/ Windows 托盘程序(C# / .NET 10) │ ├── Program.cs 入口、单实例、启动各服务 │ ├── TcpServer.cs TCP 服务、配对与认证 │ ├── DiscoveryResponder.cs UDP 自动发现响应 │ ├── RelayClient.cs 外网中继客户端 │ ├── TextInjector.cs SendInput 文字注入 │ ├── TrayApp.cs 托盘图标与菜单 │ ├── PairingForm.cs 配对信息窗口 │ ├── AutoStart.cs 开机自启 │ ├── AppConfig.cs 配置读写 │ └── Log.cs 日志 └── relay/ 外网中继服务器(Python 3,零第三方依赖) └── server.py ``` ## 快速开始 > 下面用到的 `PhoneType.exe` 和 `PhoneType-debug.apk` 是构建产物,未纳入版本库,请按「从源码构建」一节自行生成。 ### 1. 电脑端 双击运行 `PhoneType.exe`(单文件,不需要安装 .NET 运行时)。 首次运行时 Windows 会弹出防火墙提示,**必须勾选"专用网络"并允许**,否则手机连不上。 运行后托盘会出现一个蓝色小飞机图标。双击图标打开配对窗口,可以看到: - **配对码**:6 位数字,每次启动随机生成 - **电脑地址**:形如 `192.168.1.10:17321` 右键托盘图标可以设置开机自启、打开日志目录。 ### 2. 手机端 安装 `PhoneType-debug.apk`,打开 APP。 首次使用允许通知权限(用于常驻连接的前台服务通知)。 ### 3. 连接 **同一 WiFi(局域网)** 1. 手机和电脑连**同一个 WiFi** 2. APP 里点「自动发现电脑」,会自动填好 IP 和端口 - 如果发现失败,手动填配对窗口里的 IP,端口 `17321` 3. 填上配对窗口里的 6 位配对码 4. 点「连接并开始同步」,状态变成绿色「已连接 xxx」即成功 **不在同一网络(外网中继)** 1. 电脑端双击托盘图标,在「外网中继」填好 `服务器地址:端口`,点「保存中继」,重启 PhoneType 2. 重启后配对窗口右侧会出现二维码 3. 手机 APP 点「扫码填写中继配置」,扫描二维码,自动填好中继地址、房间号和配对码并开始连接 配对成功后手机会记住令牌,以后不用再填配对码,打开 APP 点连接即可。 > 二维码只用于外网中继;同一 WiFi 下不需要扫码。 ### 4. 使用 1. 把光标放到电脑上你想输入的位置(微信、Word、浏览器搜索框都行) 2. 回到手机 APP,在顶部的大输入框里用语音输入法说话 3. 停顿约 0.8 秒,文字自动出现在电脑上 4. 想开始新的一句,点输入框右下角「清空」 > 输入框下方的提示会显示「已发送 N 段」,如果显示「电脑未连接」,检查手机和电脑是否在同一网络、电脑端防火墙是否放行。 ## 外网中继(可选) 手机和电脑不在同一网段时(比如电脑在公司、手机在 4G),用中继服务器转发。 ### 部署中继服务器 需要一台有公网 IP 的机器,装了 Python 3.6+(不需要任何第三方库): ```bash cd relay python3 server.py ``` 默认监听 `0.0.0.0:8787`,可用环境变量改: ```bash HOST=0.0.0.0 PORT=9000 python3 server.py ``` **记得在云服务器安全组放行对应端口**,否则外网连不上(本机 `ss -lntp` 能看到监听,但外部仍然超时,一般就是安全组没放行)。 用 systemd 常驻(推荐): ```ini # /etc/systemd/system/phonetype-relay.service [Unit] Description=PhoneType Relay Server After=network.target [Service] Type=simple ExecStart=/usr/bin/env python3 /opt/phonetype-relay/server.py WorkingDirectory=/opt/phonetype-relay Restart=always RestartSec=3 Environment=PYTHONUNBUFFERED=1 Environment=PORT=8787 [Install] WantedBy=multi-user.target ``` ```bash systemctl daemon-reload systemctl enable --now phonetype-relay systemctl status phonetype-relay ``` ### 配置两端 1. **电脑端**:双击托盘图标,在「外网中继」输入框填 `服务器IP:8787`,点「保存中继」,然后重启 PhoneType。窗口标题处会显示房间号。 2. **手机端**:在「外网中继」填 `服务器IP:8787`,在「房间号」填电脑上显示的那个房间号,然后点连接。 房间号由电脑设备 ID 生成,固定不变,配置一次即可。 > 中继只做透明转发,不存储任何内容;配对和认证仍然在电脑端完成。 ## 从源码构建 ### 电脑端 需要 .NET SDK 10: ```bash dotnet publish pc/PhoneType.Pc/PhoneType.Pc.csproj -c Release -r win-x64 \ --self-contained true -p:PublishSingleFile=true \ -p:IncludeNativeLibrariesForSelfExtract=true -o dist/pc ``` 产物:`dist/pc/PhoneType.exe` ### 手机端 需要 Android SDK(compileSdk 35)和 JDK 17: ```bash cd android ./gradlew assembleDebug ``` 产物:`android/app/build/outputs/apk/debug/app-debug.apk` 如果你没有 `gradlew`,用本机 Gradle 8.11.1: ```bash cd android gradle assembleDebug ``` 构建前确认 `android/local.properties` 里 `sdk.dir` 指向你的 Android SDK 路径。 ## 通信协议 两端都是换行分隔的 JSON,方便调试。 **配对** ```json {"type":"pair","code":"123456","device":"PGZ110"} → {"type":"paired","token":"...","name":"DESKTOP-XXX"} ``` **认证**(已配对过) ```json {"type":"auth","token":"...","device":"PGZ110"} → {"type":"auth_ok","name":"DESKTOP-XXX"} ``` **发送文字** ```json {"type":"text","text":"你好","seq":1} → {"type":"ack","seq":1} ``` **心跳**:`{"type":"ping"}` / `{"type":"pong"}`,每 20 秒一次。 **自动发现**:手机向 `255.255.255.255:17320` 广播 `PHONETYPE_DISCOVER`,电脑回 JSON(含名称、端口、IP 列表)。 ## 常见问题 **手机连不上电脑** - 确认在同一个 WiFi(注意有些路由器开了"AP 隔离",会禁止设备互访) - 确认电脑防火墙放行了 17321 端口(专用网络) - 关掉 VPN 再试一次 **文字没有出现在电脑上** - 看托盘图标的状态是不是"已连接" - 如果目标窗口是**以管理员身份运行**的(如任务管理器、某些 IDE),PhoneType 也必须右键"以管理员身份运行",否则 Windows 会拦截输入注入 **手机息屏后断连** - APP 里点「允许后台运行」,关闭省电限制 - 部分国产系统还需要在"最近任务"里给 PhoneType 加锁 **asdf 这类短词发不出去** - 纯英文 1~2 个字母可能被过滤,正常整句不受影响 ## 已知限制 - 只同步**追加**的文字。在输入框里删除或修改已发送的内容,不会同步回电脑 - 拼音输入法的组合中间态(还没选字的拼音串)如果停顿超过 0.8 秒,可能被当作文字发出去。用语音输入法"说完直接上屏"不受影响 - 文字注入优先用窗口消息直接投递(兼容性最好,不依赖系统输入队列);浏览器、Electron、WPF 类应用会改用模拟键盘输入,若这些应用里输入无效,通常是安全软件或系统策略拦截了模拟输入 - 目标窗口以管理员身份运行时,PhoneType 也需要以管理员身份运行,否则系统会拦截输入 - 电脑锁屏或处于 UAC 安全桌面时无法注入 - 电脑端目前只支持 Windows ## 开源协议 MIT