You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Electron向外部应用写入文本在Windows/Ubuntu失效问题

修复Electron跨平台(Windows/Ubuntu)失焦后输入焦点问题

问题分析

当前代码在Mac上能正常运行,是因为browser-window-blur触发后,系统可快速完成焦点切换,keyboard.type能正确输入到之前的应用。但Windows和Ubuntu的窗口焦点切换流程与Mac不同,再加上robotjs的跨平台兼容性局限,导致输入功能失效。

解决方案

1. 统一使用跨平台输入库(替换robotjs)

@nut-tree/nut-js原生支持Windows、Mac、Linux全平台,无需分平台分支处理,兼容性更稳定。修改代码如下:

import { keyboard } from '@nut-tree/nut-js';
// 移除@jitsi/robotjs依赖

async function insertMessage() {
    const messageToInsert = 'demo';
    await keyboard.type(messageToInsert); // 全平台统一调用
}

app.on('browser-window-blur', () => {
  console.log('app.on browser-window-blur');
  setTimeout(insertMessage, 300); // 延长延迟适配Windows/Ubuntu的焦点切换速度
});

2. 调整延迟时间

Windows和Ubuntu的窗口焦点切换所需时间比Mac更长,150ms可能不足以让系统完成焦点切换到之前的应用。建议将延迟调整到300-500ms,可根据实际测试结果微调最优值。

3. 处理Ubuntu的权限限制

Ubuntu默认限制模拟输入的权限,需给应用授予辅助功能权限:

  • 打开系统设置 > 隐私与安全 > 辅助功能
  • 找到你的Electron应用,开启「允许控制屏幕和键盘」权限
  • 权限设置完成后重启应用,确保权限生效

4. 验证焦点切换状态(可选进阶)

如果上述方法仍不生效,可通过系统活跃窗口API确认焦点是否正确切换,示例代码:

import { keyboard, window } from '@nut-tree/nut-js';

async function insertMessage() {
    // 等待系统完成焦点切换到之前的活跃窗口
    await window.waitForActiveWindow();
    const messageToInsert = 'demo';
    await keyboard.type(messageToInsert);
}

测试注意事项

  • Windows平台测试时,可尝试以管理员权限运行应用(部分场景下需要)
  • Ubuntu平台修改权限后,务必重启应用再测试

内容的提问来源于stack exchange,提问作者Ryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:06:01