能否在Mac其他应用上叠加SwiftUI Views并实现光标弹窗文本编辑?
解决方案
一、在其他应用光标位置显示悬浮窗口
你已经通过Accessibility API获取到光标位置,接下来可以基于
NSWindow(macOS平台)创建无边框、置顶的悬浮窗口:- 配置窗口样式:设置
styleMask为.borderless,窗口层级level设为.popUpMenu或.statusBar,确保窗口能显示在其他应用上方 - 转换光标坐标:将Accessibility API拿到的局部坐标转为全局屏幕坐标,再计算窗口显示位置(比如光标上方偏移10px,避免遮挡输入区域)
- 定位并显示窗口:调用
setFrame(_:display:animate:)设置窗口位置,再用makeKeyAndOrderFront(nil)触发显示
- 配置窗口样式:设置
注意事项:
- 必须确保你的应用已获得系统的辅助功能权限(在「系统设置-隐私与安全性-辅助功能」中开启)
- 监听文本框的光标移动事件,实时更新悬浮窗口位置,避免光标移动后窗口错位
二、编辑其他应用中的文本
基于Accessibility API可以实现文本编辑,步骤如下:
- 获取目标文本框的
AXUIElement实例(你能获取光标位置,应该已经能定位到对应的元素) - 直接插入表情:调用
AXUIElementPerformAction执行kAXInsertTextAction动作,传入表情文本即可插入到光标位置 - 替换表情名称:先通过
AXUIElementCopyAttributeValue获取文本框全部内容,匹配并替换冒号包裹的表情名称后,再用AXUIElementSetAttributeValue更新文本框内容;或者结合光标位置定位到目标文本段进行精准替换
- 获取目标文本框的
示例Swift代码片段(macOS):
// 向目标文本框插入指定文本 func insertEmoji(to textFieldElement: AXUIElement, emoji: String) { let emojiCF = emoji as CFString AXUIElementPerformAction(textFieldElement, kAXInsertTextAction, emojiCF) }
三、常见问题排查
- 悬浮窗口不显示:检查窗口
isOpaque是否设为false(无边框窗口需透明背景),窗口层级level是否设置正确,同时确认系统辅助权限已完全授予 - 无法编辑文本:部分自定义或加密文本框可能不支持Accessibility API,优先测试原生应用(如备忘录、文本编辑)确认功能正常,再排查第三方应用兼容性
内容的提问来源于stack exchange,提问作者A. Patel
相关产品推荐
相关产品推荐

