展示 HN:SpinWin – 一款用于可视化旋转或旋转任意窗口的 macOS 菜单栏应用
一款 macOS 菜单栏工具,通过任意角度(90° 增量、任意角度或连续旋转)可视化地旋转所选窗口。它的工作原理(以及原因)是 macOS 没有公共 API 可以旋转其他应用的窗口。真正的旋转需要通过禁用系统完整性保护的私有 SkyLight 调用(CGSSetWindowTransform)——这并不值得。相反,SpinWin 是伪造的:通过无障碍 API 将选定窗口隐藏在屏幕外。它仍然在那渲染,因此可以持续捕获。使用 ScreenCaptureKit(SCStream + desktopIndependentWindow 过滤器)连续捕获其内容——这仅抓取该窗口的缓冲区,因此覆盖层不会自我镜像。将帧绘制在一个透明、无边框的覆盖窗口中,该窗口放置在原来的位置,通过 CALayer 转换进行旋转。由于这是一个层转换,任何角度都可以适用——覆盖层的大小与旋转内容的边界框相匹配,因此没有内容被剪裁,并且在旋转时使用对角线大小的正方形。使用方法获取 SpinWin 最简单的方式是下载最新的版本——下载已用开发者 ID 签名并经过苹果的公证,因此可以在没有 Gatekeeper 警告的情况下启动。或者自己构建:./scripts/build-app.sh # 构建 SpinWin.app(发布)打开 SpinWin.app # 授予屏幕录制 + 无障碍权限在开发期间快速迭代:swift build && swift run SpinWin左击菜单栏图标以开始:在底部选项栏中选择一个旋转(预设角度、旋转速度 + 方向或自由旋转),然后单击您想要的窗口。拖动覆盖层以重新定位;拖动其手柄以自由旋转。按下覆盖层上的 Esc 键以停止并还原窗口。右键单击(或 Control-单击)图标以打开菜单:活动旋转(针对每个窗口的角度/旋转控制)、停止所有和退出。权限屏幕录制——捕获窗口内容。无障碍——将源窗口移动到屏幕外并还原它。当前限制覆盖层是实时图像,不可交互。您可以拖动和旋转它,但单击和键击不会发送到底下的真实窗口。任务控制/Exposé 泄漏。隐藏的窗口停留在屏幕外但仍然是一个真实窗口,因此 Exposé 显示它是未旋转的。没有公共 API 来排除其他应用的窗口在任务控制中,最小化它会停止捕获。一些应用程序会限制屏幕外窗口的渲染,这可能会减缓视频流。一个在旋转时自行调整大小的窗口保留其原始足迹。您不能拖动调整隐藏窗口的大小,但应用程序仍然可以自主调整其大小(如适应新曲目的视频播放器,或响应转义序列的终端)。捕获被信箱框入原始大小,直到您停止并再次旋转它。布局文件角色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绘制菜单栏图标
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡