← 全部作品
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 + 高效能擷取

  1. AXUIElement 監聽 Dock:用 Accessibility API 偵測滑鼠在哪個 Dock 圖示,避免 polling 浪費 CPU。
  2. ScreenCaptureKit 抓視窗縮圖:macOS 12.3+ 的官方 API,比 CGWindowListCreateImage 快 5 倍且支援 Retina。
  3. SwiftUI 預覽 panel:用 NSPanel 而非 NSWindow,避免搶焦點;CALayer transform 做平滑進場。
  4. 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 中斷。

對這個專案有興趣?

或者你想做類似的東西?聊聊。