开发者生态
morning
适用于现代 macOS 的 Griffin PowerMate 驱动程序
2026-05-11
1 阅读
classichasclass
适用于现代 MacOS 的 Griffin PowerMate 驱动程序 这个小驱动程序支持 Griffin PowerMate,这是过去的一个漂亮的小设备。 PowerMate 有什么作用?这是一个可以扭转或按下的旋钮。就是这样。它的底座上还有一个蓝色 LED,可以根据您正在做的事情改变强度。当它发布时,它的目的是通过在桌面上添加一个可滚动旋钮来协助视频和音频制作。当然,现代控制器的存在提供了更多的花哨功能,但是这个早期设备有一些......古怪的......。要安装,请打开 DMG 并将 PowerMate Agent 拖到您的应用程序文件夹中。然后,启动 PowerMate Agent 。当然,如果没有 PowerMate,它就什么也做不了,所以去你的垃圾 USB 抽屉里翻翻,掸去灰尘吧!您将在顶部菜单中看到一个新项目,用于控制 PowerMate 的行为。 PowerMate 充当滚动控件,因此如果活动窗口或控件具有滚动选项,则转动转盘将滚动窗口或增加/减少所选值。如果您不喜欢默认的滚动方向,可以反转滚动方向。 PowerMate 还充当鼠标按钮。短暂按下按钮相当于单击鼠标。长按该按钮相当于右键单击。您还可以更改行为,使长按充当双击。很简单,嗯?技术细节。一个小型 macOS 驱动程序,可通过 USB HID 打开 Griffin PowerMate(VID 0x077d,PID 0x0410),读取其 6 字节报告,并公开按钮和旋转事件,以便您可以将它们映射到操作(例如滚动、单击、媒体键)。设备报告总线情况,但在 macOS 上默认不执行任何操作;该库捕获设备并将事件传递给您的应用程序。报告格式(来自设备) 字节 0:按钮状态 — 0 = 释放,1 = 按下 字节 1:旋转增量 — 有符号;正 = 顺时针,负 = 逆时针(通常每个报告为 ±1 至 ±7)。设备不直接报告速度;驱动程序从报告之间的时间得出旋转速率(每秒增量)。构建并运行 cd /path/to/USB swift build swift run PowerMateDemo 插入 PowerMate 后,转动旋钮或按下按钮;演示打印事件。按 Ctrl+C 停止。系统范围驱动程序(PowerMate Agent) PowerMateAgent 将旋钮和按钮转换为任何应用程序(浏览器、编辑器等)接收的键盘/滚动事件:旋转 → 垂直滚动,或当菜单(或子菜单)聚焦时向上/向下箭头键。单击(短按)→ 鼠标左键(在光标处),或在菜单获得焦点时按 Return(选择突出显示的项目)。长按 → 鼠标右键(在光标处)。菜单和子菜单检测使用 Accessibility API:当聚焦的 UI 元素是菜单(包括子菜单)时,旋转会发送箭头键,单击会发送 Return。在“系统设置”→“隐私和安全”中授予可访问性,因此子菜单可以在不“粘着”滚动的情况下工作。如果未启用辅助功能,长按仍会进入后备“菜单模式”(箭头键直至单击或 5 秒超时)。 LED 在您转动时闪烁,闲置时变暗;按住按钮时全亮。 swift run PowerMateAgent 首次运行时,macOS 将提示输入监控权限。在系统设置→隐私和安全→输入监控中授予它并添加(或启用)终端或构建的可执行文件,然后再次运行代理。要在后台运行: swift 运行 PowerMateAgent & 或运行构建的二进制文件 ./.build/debug/PowerMateAgent 并将其添加到登录项(如果您希望它在登录时启动)。要创建经过签名、经过公证的应用程序(或安装程序)以便其他人可以在没有安全警告的情况下使用它,请参阅 DISTRIBUTION.md 。你需要一个苹果开发者帐户;用户首次使用拨号盘时仍需要授予输入监控(或可访问性)一次。在您的应用程序中使用 1. 添加包 在您的应用程序的 Package.swift 中(或 Xcode:文件 → 添加包依赖项): dependencys: [ . package ( path : " /path/to/USB " ) , // 或您的克隆 URL ] , Targets: [ . target(name:"YourApp",dependency:["PowerMateDriver"]),]2. 启动驱动程序并映射事件 import PowerMateDriver let driver = PowerMateDriver() // 可选:使用闭包进行简单映射 driver 。 onRotate = { delta , 速率 // delta > 0 = 顺时针, delta < 0 = 逆时针 // 速率 = 每秒增量(第一个报告中为 nil);用于速度相关的映射 // 例如滚动:CGEventCreateScrollWheelEvent(..., delta * lineHeight) } 驱动程序。 onButtonDown = { /* 例如模拟点击或切换 */ } 驱动程序。 onButtonUp = { } // 或者对所有事件使用委托 driver . delegate = self // 实现 PowerMateDriverDelegate 驱动程序 . start ( ) // 保持运行循环运行(例如应用程序中的主线程) 3. 事件类型 PowerMateEvent.buttonDown / buttonUp — 旋钮按下/释放 PowerMateEvent.buttonClick — 短按并释放(在 longPressThreshold 下)。 PowerMateEvent.buttonLongPress — 按住至少 longPressThreshold ,然后