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

Swift 5中CGEvent无法向Microsoft Remote Desktop远程窗口粘贴文本

问题描述

用Swift 5开发的应用,通过CGEvent向当前聚焦窗口粘贴文本,本地运行正常,但在Microsoft Remote Desktop的远程窗口中失效。手动按Ctrl+V可正常粘贴,但代码实现时仅输出单个"v"字符。尝试过使用maskControl和maskCommand掩码,结果一致,且剪贴板已正确复制内容。

相关代码(两种尝试):

DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
    let event1 = CGEvent(keyboardEventSource: nil, virtualKey: 0x09, keyDown: true); // ctrl-v down
    event1?.flags = CGEventFlags.maskControl;
    event1?.post(tap: CGEventTapLocation.cghidEventTap);
    
    let event2 = CGEvent(keyboardEventSource: nil, virtualKey: 0x09, keyDown: false) // cmd-v up
    event2?.post(tap: CGEventTapLocation.cghidEventTap)
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
    let event1 = CGEvent(keyboardEventSource: nil, virtualKey: 0x09, keyDown: true); // ctrl-v down
    event1?.flags = CGEventFlags.maskCommand;
    event1?.post(tap: CGEventTapLocation.cghidEventTap);
    
    let event2 = CGEvent(keyboardEventSource: nil, virtualKey: 0x09, keyDown: false) // cmd-v up
    event2?.post(tap: CGEventTapLocation.cghidEventTap)
}
解决方案

Remote Desktop对模拟键盘事件的处理逻辑和本地不同,它需要完整的修饰键按下→目标键按下→目标键释放→修饰键释放的事件序列,而非在单个目标键事件中附加修饰键flags。

修正后的代码

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // 增加初始延迟确保剪贴板同步
    // 按下Control键(虚拟键码0x3B对应kVK_Control)
    let controlDown = CGEvent(keyboardEventSource: nil, virtualKey: 0x3B, keyDown: true)
    controlDown?.post(tap: .cghidEventTap)
    
    // 事件间加短延迟,适配Remote Desktop处理速度
    usleep(15_000)
    
    // 按下V键(虚拟键码0x09对应kVK_v)
    let vDown = CGEvent(keyboardEventSource: nil, virtualKey: 0x09, keyDown: true)
    vDown?.post(tap: .cghidEventTap)
    
    usleep(15_000)
    
    // 释放V键
    let vUp = CGEvent(keyboardEventSource: nil, virtualKey: 0x09, keyDown: false)
    vUp?.post(tap: .cghidEventTap)
    
    usleep(15_000)
    
    // 释放Control键
    let controlUp = CGEvent(keyboardEventSource: nil, virtualKey: 0x3B, keyDown: false)
    controlUp?.post(tap: .cghidEventTap)
}

额外注意事项

  1. 剪贴板同步延迟:本地剪贴板和Remote Desktop的剪贴板同步需要时间,初始延迟可根据实际情况调整(0.3-1秒均可)。
  2. 事件延迟:Remote Desktop处理模拟事件的速度比本地慢,事件间加入10-20ms的延迟能确保事件被正确识别。
  3. 虚拟键码正确性:确认使用的虚拟键码对应正确的按键(Control键为0x3B,V键为0x09)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 10:25:20