← 全部作品
NATIVE已完成2024
dockPeek
macOS 原生工具 — 滑鼠移到 Dock 圖示時,即時預覽該 App 所有開啟視窗的縮圖。Spaces / 全螢幕視窗都支援。
- 角色
- 主導 + 原生開發
- 時程
- 2024
- Reading
- 2 分鐘
技術棧
SwiftSwiftUIAppKitAXUIElementScreenCaptureKit
產品畫面
SCREENSHOTS · COMING SOON
產品截圖補上中。把圖丟到 public/works/<slug>/ 並在 mdx frontmatter 加 screenshots 陣列即可。
public/works/dockpeek/01.png從 Windows 切到 Mac 的人最常抱怨的就是「Dock 不能像 Windows 工作列那樣 hover 預覽視窗」。dockPeek 補上這個缺失:滑鼠移到 Dock 圖示,半秒後浮出該 App 所有視窗的即時縮圖,點擊直接帶到該視窗。
問題
- macOS 原生 Dock 只能切 App,無法快速跨視窗切換
- Mission Control 太重、不夠即時
- 第三方工具多用 private API、隨系統升級就壞
解法
純原生 API + 高效能擷取:
- AXUIElement 監聽 Dock:用 Accessibility API 偵測滑鼠在哪個 Dock 圖示,避免 polling 浪費 CPU。
- ScreenCaptureKit 抓視窗縮圖:macOS 12.3+ 的官方 API,比 CGWindowListCreateImage 快 5 倍且支援 Retina。
- SwiftUI 預覽 panel:用 NSPanel 而非 NSWindow,避免搶焦點;CALayer transform 做平滑進場。
- Spaces / Mission Control 整合:跨 Space 視窗也能列出,點擊自動切到該 Space。
技術棧
- UI: SwiftUI 5 + AppKit(NSPanel)
- Accessibility: AXUIElement API
- Screen capture: ScreenCaptureKit (macOS 12.3+)
- Window management: CGWindowListCopyWindowInfo + Spaces API
成果
- 完成可運作版本
- 與 macOS 原生 Dock 行為無縫整合
- 預覽 frame rate 60fps,CPU < 2% idle
- 全部用 public API,未來 macOS 版本相容性高
學到什麼
- AXUIElement 是 mac 自動化的隱藏寶藏:很多人以為要用 private API 才能做 Dock 互動,其實 AX API 已經夠用。
- ScreenCaptureKit 的 power:比舊 API 快太多,且原生支援多顯示器與 Retina;早期 Mac 工具普遍卡頓的問題在 ScreenCaptureKit 推出後消失。
- NSPanel vs NSWindow:對 floating UI 元素,NSPanel 是對的選擇;用 NSWindow 會搶焦點導致 Dock interaction 中斷。