
导航菜单
可切换导航。 登录
外观设置
平台
- AI 代码创作
- 开发者工作流
- 应用程序安全
- 探索
解决方案
资源
开源
企业版
可搜索或跳转至相关内容。
搜索功能
可搜索代码、仓库、用户、问题、拉取请求等。搜索后可清除内容。搜索语法提示
反馈渠道
我们会认真阅读每一条反馈,并重视您的意见。可选择包含电子邮件地址以便联系。取消 提交反馈
保存搜索
使用保存的搜索能更快筛选结果。名称 查询 若要查看所有可用限定符,可参阅我们的文档。取消 创建保存的搜索
外观设置
可重置焦点。若您已在另一个标签页或窗口中登录、注销或切换账户,[重新加载]以刷新会话。关闭提醒 {{ message }}
[ alokdhir ] / [spinwin] 公开
其他导航选项
alokdhir/spinwin
master [分支][标签] 可转到文件查看代码,还能打开更多操作菜单。
文件夹和文件
| 名称 | 名称 | 最后提交消息 | 最后提交日期 |
|---|
最新提交及历史记录
[33 次提交] 33 次提交 [资源] | [资源] | | [Sources/SpinWin] | [Sources/SpinWin] | | [文档] | [文档] | | [脚本] | [脚本] | | [.gitignore] | [.gitignore] | | [AGENTS.md] | [AGENTS.md] | | [LICENSE] | [LICENSE] | | [Package.swift] | [Package.swift] | | [README.md] | [README.md] | 可查看所有文件。
仓库文件导航
- 自述文件
- MIT 许可证
更多项目
SpinWin 介绍
SpinWin 是一款 macOS 菜单栏实用工具,能将选定窗口按任意角度(90° 增量、任意角度或连续旋转)进行可视化旋转。
工作原理及原因
由于 macOS 没有用于旋转其他应用程序窗口的公共 API,要实现真正旋转需禁用系统完整性保护并调用私有 SkyLight 函数(`CGSSetWindowTransform`),不太值得。因此,SpinWin 采用模拟旋转方法:
- 隐藏:通过辅助功能 API 将选定窗口移至屏幕外隐藏,但它仍会继续渲染,以便进行捕获。
- 捕获:使用 ScreenCaptureKit(`SCStream` + `desktopIndependentWindow` 过滤器)持续捕获窗口内容,这样只会抓取该窗口的缓冲区,确保覆盖层不会自我镜像。
- 绘制:将捕获的帧绘制在一个透明、无边框的覆盖窗口中,该窗口放置在原始窗口的位置,并使用 `CALayer` 变换进行旋转。因采用图层变换,任何角度都能实现旋转。覆盖层大小会根据旋转内容的边界框调整,确保不裁剪,旋转时用对角线大小的正方形。
使用方法
获取 SpinWin 最简单的方式是下载[最新版本],该下载文件已用开发者 ID 签名并由 Apple 公证,启动时无 Gatekeeper 警告。也可自行构建:
./scripts/build-app.sh # 构建 SpinWin.app(发布版)open SpinWin.app # 授予屏幕录制和辅助功能权限
开发过程中快速迭代:
swift build && swift run SpinWin
- 左键点击菜单栏图标开始操作:在底部选项栏选旋转方式(预设角度、旋转速度和方向或自由旋转),再点击想旋转的窗口。拖动覆盖层可重新定位,拖动其手柄可自由旋转。在覆盖层按 Esc 键可停止旋转并恢复窗口。
- 右键点击(或按住 Control 键点击)图标可打开菜单,包含活动旋转(带每个窗口的角度/旋转控制)、停止所有旋转和退出选项。
权限要求
- 屏幕录制:用于捕获窗口内容。
- 辅助功能:用于将源窗口移至屏幕外并恢复。
当前限制
- 覆盖层仅为实时画面,不具备交互性:可拖动和旋转,但点击和按键操作不会发送到下方真实窗口。
- Mission Control / Exposé 显示问题:隐藏窗口虽移至屏幕外,但仍是真实窗口,在 Exposé 中显示为未旋转状态。目前无公共 API 可将其他应用程序窗口排除在 Mission Control 外,而最小化窗口会停止捕获。
- 部分应用程序渲染限制:一些应用程序会限制屏幕外窗口渲染,可能导致画面更新变慢。
- 旋转时窗口自动调整大小问题:旋转中自动调整大小的窗口会保持原始尺寸。无法通过拖动调整隐藏窗口大小,但应用程序本身仍可调整(如视频播放器适应新视频轨道、终端响应转义序列)。捕获内容会填充到原始尺寸中,直到停止旋转并重新操作。
代码结构
| 文件 | 角色 |
|---|---|
| `main.swift` | 应用程序入口点(辅助/菜单栏策略) |
| `AppDelegate.swift` | 菜单栏项目;左键点击旋转,右键点击打开菜单 |
| `Permissions.swift` | 在启动时请求屏幕录制和辅助功能权限 |
| `WindowPicker.swift` | 全屏窗口选择器 + 旋转选项栏 |
| `RotationManager.swift` | 跟踪每个窗口的旋转会话 |
| `RotationSession.swift` | 协调每个窗口的隐藏 → 捕获 → 覆盖过程 |
| `CaptureEngine.swift` | ScreenCaptureKit 流 → IOSurface 帧 |
| `OverlayWindow.swift` | 透明的旋转/自旋覆盖层,可拖动 |
| `AccessibilityWindowMover.swift` | 将源窗口移至屏幕外并恢复 |
| `ActivationChoice.swift` | 初始旋转选择(角度/旋转/自由) |
| `SpinDirection.swift` | 顺时针/逆时针旋转选项 |
| `MenuBarIcon.swift` | 绘制菜单栏图标 |
关于
SpinWin 是一款 macOS 菜单栏应用程序,通过 ScreenCaptureKit 模拟 macOS 没有 API 支持的窗口旋转或自旋功能。github.com/alokdhir/spinwin/releases/latest
主题
[辅助功能 API][Core Animation][macOS][macOS 应用程序][菜单栏][ScreenCaptureKit][Swift]
资源
- 自述文件
- MIT 许可证
加星数
关注者
复刻数
版本发布
软件包
贡献者
语言
页脚
[ ] (C) 2026 GitHub, Inc.
页脚导航
此时您无法执行该操作。


被折叠的 条评论
为什么被折叠?



