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) }
额外注意事项
- 剪贴板同步延迟:本地剪贴板和Remote Desktop的剪贴板同步需要时间,初始延迟可根据实际情况调整(0.3-1秒均可)。
- 事件延迟:Remote Desktop处理模拟事件的速度比本地慢,事件间加入10-20ms的延迟能确保事件被正确识别。
- 虚拟键码正确性:确认使用的虚拟键码对应正确的按键(Control键为
0x3B,V键为0x09)。
内容的提问来源于stack exchange,提问作者Ryan H
相关产品推荐
相关产品推荐

