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

沙盒应用能否向指定应用(如TextEdit)发送CMD+V按键指令?

沙盒应用向指定应用发送CMD+V的实现方案

核心结论

沙盒应用可以实现该需求,但必须配置特定权限并修正代码逻辑,以下是具体步骤:

一、配置沙盒权限

沙盒应用默认无法跨应用发送模拟事件,必须开启辅助功能权限:

  1. 在Info.plist中添加权限描述:
    添加NSAccessibilityUsageDescription键,值填写权限申请说明(例如:"需要向指定应用发送粘贴指令")。
  2. 在Xcode的「Signing & Capabilities」中,开启沙盒的同时,勾选「Accessibility」权限;或手动在Entitlements文件中添加com.apple.security.accessibility并设为true。

二、修正代码逻辑

之前的代码存在两个关键问题:仅发送了按键按下事件、未处理沙盒权限限制。以下是修正后的完整代码:

import SwiftUI
import CoreGraphics
import AppKit

class MyKeys {
    func sendPasteToTextEdit() {
        // 获取运行中的TextEdit实例
        guard let textEditApp = NSRunningApplication.runningApplications(withBundleIdentifier: "com.apple.TextEdit").first else {
            print("TextEdit未运行")
            return
        }
        
        // 检查辅助功能权限,无权限则引导用户开启
        guard AXIsProcessTrusted() else {
            print("请在系统设置-隐私与安全性-辅助功能中开启本应用权限")
            NSWorkspace.shared.open(URL(string: "x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility")!)
            return
        }
        
        guard let sourceRef = CGEventSource(stateID: .combinedSessionState) else { return }
        
        // 构造Command+V的完整按键事件(按下+抬起)
        let commandFlag = CGEventFlags.maskCommand
        
        // 发送V键按下事件
        let vKeyDown = CGEvent(keyboardEventSource: sourceRef, virtualKey: 9, keyDown: true)
        vKeyDown?.flags = commandFlag
        vKeyDown?.postToPid(textEditApp.processIdentifier)
        
        // 发送V键抬起事件
        let vKeyUp = CGEvent(keyboardEventSource: sourceRef, virtualKey: 9, keyDown: false)
        vKeyUp?.flags = commandFlag
        vKeyUp?.postToPid(textEditApp.processIdentifier)
        
        // 可选:若需确保TextEdit前置,可激活应用(需辅助权限)
        textEditApp.activate(options: .activateIgnoringOtherApps)
    }
}

struct ContentView: View {
    var body: some View {
        Button(action: {
            let myKeys = MyKeys()
            myKeys.sendPasteToTextEdit()
        }, label: {
            Text("粘贴到TextEdit")
        })
        .padding()
    }
}

关键说明

  • 辅助权限是前提:无此权限时,沙盒应用无法跨应用发送事件或激活其他应用,必须引导用户手动开启。
  • 完整按键事件:仅发送keyDown会导致按键处于“按住”状态,必须搭配keyUp才能完成完整的粘贴操作。
  • postToPid的有效性:在拥有辅助权限后,postToPid可将事件直接发送到目标应用进程,不会触发当前应用的粘贴操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 19:20:06