鸿蒙远程控制台:用手机操控 Electron 桌面应用(完整实战)
这个项目的意义不止于“遥控电脑”,它揭示了一个趋势:🔮未来的交互,不再是“人 → 设备”,而是“设备 → 设备”自主协同。你的手表知道你开始跑步,自动暂停电脑音乐;你的车载屏幕检测到你靠近,提前拉取桌面会议链接;你的智慧屏感知你在厨房,把菜谱推送到最近的设备。而这一切的基础,就是——开放的通信协议 + 统一的控制语言 + 开发者的创造力。作为开发者,我们要做的,就是率先迈出第一步。
📌 作者:L、218
🧩 平台:CSDN
🕒 发布时间:2025年12月6日
🔖 标签:鸿蒙开发Electron远程控制WebSocketArkTS跨平台通信设备协同
🌟 引言:你的手机,为什么不能是电脑的“遥控器”?
想象一下这些场景:
🎮 站在客厅,用手机滑动控制电脑上的 PPT 演示?
🎵 在厨房做饭时,用手表或手机切歌,而音乐正在桌面播放?
📊 开会时,用鸿蒙平板实时调整大屏图表参数,无需碰键盘?
这并不是科幻。今天,我们将 用一部鸿蒙手机作为“远程控制面板”,通过自定义协议操控 Electron 桌面应用!
本文将带你从零构建一个名为 Harmony Remote 的项目:
- ✅ 手机端发送控制指令(如“上一页”、“播放/暂停”)
- ✅ Electron 桌面端接收并执行系统操作
- ✅ 支持窗口最小化、音量调节、快捷键模拟等
- ✅ 图文并茂 + 完整可运行代码
无需依赖华为多屏协同,纯代码实现!
🧭 目录导航
- 【功能目标】我们要做什么?
- 【架构设计】控制流如何流转?
- 【桌面端】Electron 接收指令并执行动作
- 【手机端】鸿蒙 UI 控制面板开发(ArkTS)
- 【通信协议】定义远程控制指令集
- 【实战演示】PPT 翻页控制全流程
- 【安全增强】加入连接认证与超时机制
- 【结语】未来:万物皆可被“轻控”
1️⃣ 功能目标:实现什么?
我们将打造一个 基于局域网的轻量级远程控制系统,支持以下功能:
| 控制功能 | 实现方式 |
|---|---|
| 上一页 / 下一页 | 发送 prev / next 指令,模拟键盘 ← / → |
| 播放 / 暂停 | 发送 play_pause,调用媒体控制 |
| 最小化窗口 | minimize → BrowserWindow.minimize() |
| 音量+ / 音量− | volume_up / volume_down |
| 自定义快捷键 | 如 cmd:ctrl+c |
🎯 最终效果:打开 Electron 应用 → 启动鸿蒙控制端 → 手机变身为万能遥控器!
2️⃣ 架构设计:控制流与数据流分离
+-----------------------------+ WebSocket +----------------------------+
| Electron 桌面应用 | <--------------------> | 鸿蒙手机控制面板 |
| - 启动 WebSocket Server | {cmd: "next"} | - 提供按钮式 UI 操作界面 |
| - 监听指令并执行系统操作 | | - 主动连接桌面 IP |
+-----------------------------+ +----------------------------+
↑ ↑
(Node.js + robotjs + electron) (ArkTS + @ohos.net.http)
📌 核心思路:
- 桌面为服务端(Server):开启 WebSocket 服务,等待连接
- 手机为客户端(Client):连接后发送控制命令
- 使用标准 JSON 协议通信,易于扩展
3️⃣ 桌面端:Electron 实现控制中心(Node.js)
🛠 安装依赖
npm install electron ws robotjs --save
ws:轻量级 WebSocket 服务器robotjs:模拟键盘鼠标操作(需原生编译)
📄 main.js(主进程启动服务)
const { app, BrowserWindow, ipcMain } = require('electron')
const WebSocket = require('ws');
let mainWindow;
let wss;
function createWindow () {
mainWindow = new BrowserWindow({
width: 400,
height: 300,
webPreferences: {
nodeIntegration: false,
contextIsolation: true
}
})
mainWindow.loadFile('index.html')
// 启动 WebSocket 服务
wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', (ws) => {
console.log('📱 客户端已连接');
ws.send(JSON.stringify({ type: 'status', msg: 'connected' }));
ws.on('message', (data) => {
try {
const cmd = JSON.parse(data);
handleCommand(cmd, ws);
} catch (e) {
console.error('指令解析失败', e);
}
});
ws.on('close', () => {
console.log('🔌 客户端断开连接');
});
});
console.log('✅ WebSocket 服务已启动,监听端口 8080');
}
app.whenReady().then(createWindow)
app.on('window-all-closed', () => process.platform !== 'darwin' && app.quit())
📄 handlers.js(指令处理器)
const robot = require('robotjs');
const { BrowserWindow } = require('electron');
// 映射指令到操作
const commandMap = {
prev: () => robot.keyTap('left'),
next: () => robot.keyTap('right'),
play_pause: () => robot.keyTap('space'),
minimize: () => {
const win = BrowserWindow.getAllWindows()[0];
win?.isMinimized() ? win.restore() : win.minimize();
},
volume_up: () => robot.keyTap('up', 'volumeup'),
volume_down: () => robot.keyTap('down', 'volumedown'),
custom: (payload) => {
if (payload.keys) {
const keys = payload.keys.split('+'); // 如 "ctrl+shift+i"
robot.keyTap(keys.pop(), keys); // 最后一个是主键
}
}
};
function handleCommand(cmd, ws) {
console.log('📩 收到指令:', cmd);
const handler = commandMap[cmd.action];
if (handler) {
handler(cmd.payload);
ws.send(JSON.stringify({ type: 'ack', action: cmd.action, status: 'success' }));
} else {
ws.send(JSON.stringify({ type: 'error', message: '未知指令' }));
}
}
module.exports = { handleCommand };
4️⃣ 手机端:鸿蒙控制面板 UI(ArkTS)
📱 UI 效果预览
📷 https://raw.githubusercontent.com/L218/harmony-remote/main/screenshots/control-ui.png
使用鸿蒙标准组件构建简洁直观的遥控界面。
📄 ControlPanel.ets
@Entry
@Component
struct ControlPage {
private ipInput: string = '192.168.1.100' // 默认桌面IP
private isConnected: boolean = false
private websocket: WebsocketTask = null
build() {
Column() {
// IP 输入区
Row() {
TextInput({ placeholder: '输入电脑IP', text: $ipInput })
.margin(10).width('70%').borderRadius(8).backgroundColor('#f5f5f5')
Button('连接')
.onClick(() => this.connectToDesktop())
.width('25%').backgroundColor(this.isConnected ? '#9e9e9e' : '#006064')
}.width('90%')
// 控制按钮组
Grid(this.gridConfig()) {
ForEach(this.controlButtons, item => {
GridItem() {
Button(item.label)
.onClick(() => this.sendCommand(item.cmd))
.fontSize(16)
.fontColor(Color.White)
.backgroundColor(item.color || '#009688')
.width(80).height(60).borderRadius(12)
}
})
}
.columnsTemplate('1fr 1fr 1fr')
.width('90%')
.alignment(GridAlignment.CENTER)
}
.width('100%').height('100%').justifyContent(FlexAlign.Top)
}
private gridConfig = () => ({
rowsTemplate: '1fr 1fr 1fr'
})
private controlButtons = [
{ label: '⏮️ 上一页', cmd: 'prev', color: '#03a9f4' },
{ label: '⏯️ 播放', cmd: 'play_pause', color: '#ff9800' },
{ label: '⏭️ 下一页', cmd: 'next', color: '#03a9f4' },
{ label: '🔉 减音', cmd: 'volume_down', color: '#607d8b' },
{ label: '⏹️ 最小化', cmd: 'minimize', color: '#f44336' },
{ label: '🔊 加音', cmd: 'volume_up', color: '#607d8b' },
]
connectToDesktop() {
if (this.isConnected) return;
const url = `ws://${this.ipInput}:8080`;
this.websocket = webSocket.createWebSocketTask(url);
this.websocket.on('open', () => {
promptAction.showToast({ message: '✅ 已连接至电脑' });
this.isConnected = true;
});
this.websocket.on('message', (msg) => {
console.info('来自电脑的消息:', msg.message);
});
this.websocket.on('close', () => {
promptAction.showToast({ message: '🔌 连接已断开' });
this.isConnected = false;
});
this.websocket.on('error', (err) => {
promptAction.showToast({ message: '❌ 连接失败' });
console.error('WebSocket 错误:', err);
});
this.websocket.connect();
}
sendCommand(action: string) {
if (!this.isConnected) {
promptAction.showToast({ message: '请先连接电脑' });
return;
}
const msg = JSON.stringify({ action, payload: {} });
this.websocket.send(msg);
hapticVibration.perform(VibrationType.OCCURRENCE_ONCE); // 震动反馈
}
}
✅ 注意:需在
module.json5中添加网络权限和振动权限。
5️⃣ 通信协议:远程控制指令集
| 指令 | 描述 |
|---|---|
prev |
上一页(模拟左箭头) |
next |
下一页(右箭头) |
play_pause |
播放/暂停(空格键) |
minimize |
最小化窗口 |
volume_up/down |
音量调节 |
custom |
自定义快捷键 |
📌 可轻松扩展支持截图、锁屏、启动程序等高级功能。
6️⃣ 实战演示:PPT 远程翻页控制
✅ 使用流程
- 在电脑运行 Electron 应用,服务监听
0.0.0.0:8080 - 手机打开“Harmony Remote”App,输入电脑局域网 IP(如
192.168.1.100) - 点击【连接】,建立 WebSocket
- 打开 PowerPoint 或 PDF 阅读器
- 在手机点击“上一页”、“下一页”,即可远程翻页!
🎬 建议录制一段 GIF 展示操作过程,发布时插入文中。
7️⃣ 安全增强:加入认证机制(进阶)
为防止未授权控制,可加入简单 PIN 认证:
方案:握手验证
// 桌面端随机生成 4 位 PIN
const pin = Math.floor(1000 + Math.random() * 9000);
ws.send(JSON.stringify({ type: 'pin_request', pin }));
// 手机端输入 PIN 后发送验证
if (receivedPin === expectedPin) {
allowControl = true;
}
也可结合 NFC 或二维码扫码配对,提升安全性。
8️⃣ 结语:我们正走向“无界面交互”时代
这个项目的意义不止于“遥控电脑”,它揭示了一个趋势:
🔮 未来的交互,不再是“人 → 设备”,而是“设备 → 设备”自主协同。
你的手表知道你开始跑步,自动暂停电脑音乐;
你的车载屏幕检测到你靠近,提前拉取桌面会议链接;
你的智慧屏感知你在厨房,把菜谱推送到最近的设备。
而这一切的基础,就是——
开放的通信协议 + 统一的控制语言 + 开发者的创造力。
作为开发者,我们要做的,就是率先迈出第一步。
📎 参考资料
💬 互动环节
你希望下一个控制功能是什么?
- ✅ 截图并回传手机?
- ✅ 控制 VS Code 快捷键?
- ✅ 鸿蒙手表也能当遥控器?
欢迎留言告诉我👇
📌 点赞 + 收藏 + 关注 @L、218,持续输出硬核鸿蒙 × 跨端实战内容!
📦 获取源码
👉 完整项目开源地址:
GitHub:https://github.com/L218/harmony-remote
包含:
- Electron 桌面控制中心(含 WebSocket + robotjs)
- 鸿蒙手机端 ArkTS 项目
- README 中文部署指南
- 视频演示
🌟 Star 支持一下吧!
© 版权归作者所有,转载请注明出处。
作者公众号:【L的开发笔记】
技术交流群:见 GitHub README
🖼 附:运行效果截图
| 桌面端日志显示连接 | 手机端成功发送指令 |
|---|---|
| https://raw.githubusercontent.com/L218/harmony-remote/main/screenshots/desktop-connected.png | https://raw.githubusercontent.com/L218/harmony-remote/main/screenshots/mobile-sent.png |
✅ 本文适配 CSDN Markdown 渲染,可直接复制发布
🔧 建议搭配短视频/GIF 发布,阅读量更高!
🎯 SEO关键词建议:鸿蒙远程控制 手机控制电脑 Electron 控制台 ArkTS 实战 WebSocket 控制协议 跨设备交互 L、218
📢 我是 L、218,下期我们来做“鸿蒙语音指令控制 Electron 应用”!不见不散!
https://openharmonycrossplatform.csdn.net/content
更多推荐



所有评论(0)