解析:macOS 原生 Swift 運(yùn)行時(shí)如何實(shí)現(xiàn)非占用式光標(biāo)控制)
人工智能AI 應(yīng)用AI Agent代碼智能體桌面應(yīng)用開(kāi)發(fā)工具GUI 自動(dòng)化【免費(fèi)下載鏈接】cc-hahaLocal-first cross-platform desktop workspace for Claude Code / agents: multi-agent, Git worktrees, code diffs, skill marketplace, multi-model, Computer Use, task-aware desktop pets, with WeChat, Feishu, DingTalk, Telegram, WhatsApp and H5 access.項(xiàng)目地址https://gitcode.com/NanmiCoder/cc-haha點(diǎn)擊查看免費(fèi)下載cc-haha 是一款本地優(yōu)先的跨平臺(tái) AI 編程桌面工作臺(tái)它的 Computer Use電腦操控功能讓 Claude 能截圖、點(diǎn)擊、輸入替你操作那些沒(méi)有 API 的桌面應(yīng)用。在 macOS 上cc-haha 用一個(gè)原生 Swift 運(yùn)行時(shí)cu-helper實(shí)現(xiàn)了非占用式光標(biāo)控制Agent 干活時(shí)你的真實(shí)鼠標(biāo)紋絲不動(dòng)屏幕上滑動(dòng)的只是一枚虛擬光標(biāo)——你可以一邊讓 AI 操作備忘錄一邊用自己的鼠標(biāo)繼續(xù)寫(xiě)代碼。這篇文章拆解它背后的架構(gòu)與關(guān)鍵實(shí)現(xiàn)。為什么傳統(tǒng)方案會(huì)搶走你的鼠標(biāo)早期的 AI 電腦操控包括 cc-haha 最初的兼容執(zhí)行器大多基于 Python 的 pyautogui。它在 macOS 底層把鼠標(biāo)/鍵盤(pán)事件注入到HID 硬件事件層CGEventPost(kCGHIDEventTap)后果是系統(tǒng)只有一個(gè)物理光標(biāo)注入等于把真光標(biāo)拖走用戶(hù)無(wú)法同時(shí)操作事件只能落在當(dāng)前前臺(tái)窗口目標(biāo)應(yīng)用必須亮在最前全局生效無(wú)法定向投遞到某個(gè)后臺(tái) App。這正是用戶(hù)核心訴求的反面我想一邊自己工作一邊讓 Agent 在另一個(gè)應(yīng)用上跑自動(dòng)化。cc-haha 為此把最底層的 Python helper 換成了原生 Swift 二進(jìn)制 cu-helper上層安全體系與工具協(xié)議完全不動(dòng)。整體架構(gòu)只換最底一層Computer Use 是一條 6 層鏈路MCP 工具定義 → 九層安全關(guān)卡 → 會(huì)話(huà)綁定 → 宿主集成 → 進(jìn)程調(diào)用邊界Bridge→ 平臺(tái)執(zhí)行運(yùn)行時(shí)。Swift 化的精妙之處在于只替換了最底層的執(zhí)行運(yùn)行時(shí)舊的 mac_helper.py 與新的 cu-helper 遵守完全相同的 JSON 命令行協(xié)議command --payload jsonstdout 返回{ok, result}上層的 Python Bridge 調(diào)用邊界 幾乎零改動(dòng)即可在 Python 與 Swift 之間熱切換。非占用式控制的三件套1. 按 PID 定向注入事件不經(jīng)過(guò)系統(tǒng)光標(biāo)新執(zhí)行器有一條絕對(duì)規(guī)則所有鼠標(biāo)/鍵盤(pán)事件一律用CGEvent.postToPid(targetPid)即CGEventPostToPid投遞給目標(biāo)應(yīng)用進(jìn)程永遠(yuǎn)不調(diào)用 HID 層注入也永遠(yuǎn)不調(diào)用CGWarpMouseCursorPosition之類(lèi)的位移 API。事件上雖然還帶有坐標(biāo)但那只是讓目標(biāo)應(yīng)用做命中測(cè)試點(diǎn)中正確的按鈕投遞帶坐標(biāo)的事件并不會(huì)移動(dòng)硬件光標(biāo)。這條規(guī)則寫(xiě)在 Injection.swift 的文件頭注釋里是整個(gè)注入引擎的憲法。2. 虛擬光標(biāo)你自己畫(huà)一個(gè)假光標(biāo)給用戶(hù)看真光標(biāo)不動(dòng)了用戶(hù)就看不到 AI 在點(diǎn)哪里。cu-helper 的答案是自繪覆蓋層每塊屏幕上一個(gè)無(wú)邊框、透明、點(diǎn)擊穿透的浮層窗口光標(biāo)是一枚隨邏輯坐標(biāo)平滑滑動(dòng)ease-out 緩動(dòng)的動(dòng)畫(huà)元素點(diǎn)擊時(shí)播放漣漪動(dòng)效被操控的窗口還會(huì)有一圈柔和光暈跟隨。關(guān)鍵實(shí)現(xiàn)約束覆蓋層不搶焦點(diǎn)、不出現(xiàn)在 Dock、不吃鼠標(biāo)事件也不會(huì)出現(xiàn)在截圖里否則模型會(huì)看到自己的光標(biāo)形成反饋回路。邏輯位置就是唯一的光標(biāo)狀態(tài)源見(jiàn) VirtualCursor.swift。3. AccessibilityAX兜底點(diǎn)按鈕不必真的點(diǎn)postToPid對(duì)部分應(yīng)用不夠可靠所以 cu-helper 對(duì)按鈕、菜單、文本框提供 AX 控件級(jí)路徑通過(guò)坐標(biāo)找到命中控件直接執(zhí)行按下動(dòng)作或給文本框賦值。策略與業(yè)界一致CGEvent 優(yōu)先更像真實(shí)交互AX 兜底。后臺(tái)窗口截圖目標(biāo)應(yīng)用不必在最前配合不搶光標(biāo)截圖也換了引擎Capture.swift 基于 macOS 14 的 ScreenCaptureKit直接抓取指定顯示器或窗口的圖層內(nèi)容。窗口被遮擋、不在最前、甚至在另一塊屏幕上都能抓到——這就是你在 App B 工作Agent 卻在驅(qū)動(dòng) App A的底氣。人機(jī)共存如何確認(rèn)沒(méi)有人和 Agent 搶輸入一個(gè)容易被忽略的安全問(wèn)題Agent 操作到一半真人碰了鼠標(biāo)怎么辦早期實(shí)現(xiàn)用只讀事件監(jiān)聽(tīng)listen-only event tap結(jié)果踩了個(gè)大坑監(jiān)聽(tīng)鍵盤(pán)事件需要第三個(gè)系統(tǒng)權(quán)限輸入監(jiān)控而授權(quán)卡片從未請(qǐng)求過(guò)它——新裝機(jī)上所有操作直接失敗。現(xiàn)在的方案優(yōu)雅得多改讀HID 系統(tǒng)事件計(jì)數(shù)器CGEventSource.counterForEventType(.hidSystemState)零權(quán)限、不可失效且實(shí)測(cè)postToPid注入的合成為事件不會(huì)污染計(jì)數(shù)器。每次動(dòng)作前后比對(duì)計(jì)數(shù)器紀(jì)元一旦真人動(dòng)過(guò)輸入立即讓位中止。實(shí)現(xiàn)見(jiàn) PhysicalInputEpochMonitor.swift 與 ForegroundLease.swift。九道安全關(guān)卡每一次動(dòng)作都要過(guò)檢非占用不等于無(wú)邊界。每次動(dòng)作執(zhí)行前都要串過(guò) 9 層檢查全局開(kāi)關(guān) → TCC 系統(tǒng)權(quán)限輔助功能 屏幕錄制→ 會(huì)話(huà)互斥鎖 → 應(yīng)用隱藏 → 前臺(tái)應(yīng)用白名單 → 三級(jí)權(quán)限徽章read / click / full→ 受保護(hù)剪貼板 → 像素新鮮度校驗(yàn) → 才輪到執(zhí)行。任何一環(huán)失敗動(dòng)作被拒。cc-haha 自己、終端和瀏覽器也在默認(rèn)拒絕名單內(nèi)防止 Agent 反向操控宿主。如何開(kāi)啟與使用對(duì)普通用戶(hù)你只需要知道兩件事只需兩項(xiàng)系統(tǒng)權(quán)限「輔助功能」發(fā)點(diǎn)擊和輸入「屏幕錄制」截屏。輸入監(jiān)控永遠(yuǎn)不該出現(xiàn)在任何提示里。授權(quán)后需完全退出并重新打開(kāi)應(yīng)用入口打開(kāi)「設(shè)置 → Computer Use」開(kāi)啟然后給任務(wù)寫(xiě)清邊界只在備忘錄里操作比籠統(tǒng)目標(biāo)靠譜得多。日常用法、已知邊界與排查方法見(jiàn)功能指南 docs/desktop/computer-use.md。關(guān)鍵文件路徑速查模塊說(shuō)明docs/internals/computer-use.mdComputer Use 完整架構(gòu)文檔分層、授權(quán)、Teach 工作流docs/internals/computer-use-native-swift-design.md原生化 Swift 設(shè)計(jì)方案與逆向證據(jù)docs/internals/computer-use-native-manual-qa.md真機(jī)驗(yàn)證清單虛擬光標(biāo)、注入契約、安全邊界Injection.swift按 PID 事件注入引擎絕對(duì)規(guī)則見(jiàn)文件頭VirtualCursor.swift虛擬光標(biāo)覆蓋層與動(dòng)畫(huà)Capture.swiftScreenCaptureKit 后臺(tái)窗口截圖PhysicalInputEpochMonitor.swift零權(quán)限真人輸入檢測(cè)src/utils/computerUse/pythonBridge.ts進(jìn)程調(diào)用邊界Python / Swift 雙執(zhí)行器切換點(diǎn)小結(jié)cc-haha 的 Computer Use 用三個(gè)替換解決了一個(gè)大問(wèn)題事件按 PID 定向投遞不動(dòng)真光標(biāo)、自繪虛擬光標(biāo)讓用戶(hù)看得見(jiàn) AI 在干嘛、AX 控件兜底后臺(tái)應(yīng)用也能操作再配上 ScreenCaptureKit 后臺(tái)截圖和 HID 計(jì)數(shù)器人機(jī)共存檢測(cè)——整套原生 Swift 運(yùn)行時(shí)的協(xié)議邊界與舊 Python helper 完全一致上層安全體系一行未改。這也是只換最底一層架構(gòu)的勝利能力升級(jí)了復(fù)雜度卻沒(méi)有擴(kuò)散。贊分享人工智能AI 應(yīng)用AI Agent代碼智能體桌面應(yīng)用開(kāi)發(fā)工具GUI 自動(dòng)化【免費(fèi)下載鏈接】cc-hahaLocal-first cross-platform desktop workspace for Claude Code / agents: multi-agent, Git worktrees, code diffs, skill marketplace, multi-model, Computer Use, task-aware desktop pets, with WeChat, Feishu, DingTalk, Telegram, WhatsApp and H5 access.項(xiàng)目地址https://gitcode.com/NanmiCoder/cc-haha點(diǎn)擊查看免費(fèi)下載相關(guān)推薦從 pyautogui 到 Swift cu-helperclaude-code-haha Computer Use 的 macOS 原生化「不搶鼠標(biāo)」架構(gòu)從 pyautogui 到 Swift cu helperclaude code haha Computer Use 的 macOS 原生化「不搶鼠標(biāo)」架構(gòu)人工智能AI 應(yīng)用桌面應(yīng)用代碼智能體MCP Clients深度解析 cc-haha 原生 macOS Computer Use 助手 cu-helper虛擬光標(biāo)架構(gòu)、NDJSON 守護(hù)進(jìn)程協(xié)議與 TCC 穩(wěn)定簽名實(shí)踐深度解析 cc haha 原生 macOS Computer Use 助手 cu helper虛擬光標(biāo)架構(gòu)、NDJSON 守護(hù)進(jìn)程協(xié)議與 TCC 穩(wěn)定簽名實(shí)踐人工智能AI 應(yīng)用桌面應(yīng)用代碼智能體MCP Clientscc-haha 桌面端 Codex 原生 Computer Use 兼容契約深度解析cc haha 桌面端 Codex 原生 Computer Use 兼容契約深度解析 導(dǎo)讀 本文以 docs/en/internals/computer use人工智能AI 應(yīng)用桌面應(yīng)用代碼智能體MCP Clients創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考