You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在macOS上独立于自身应用追踪鼠标移动?是否存在macOS/Swift系统级或无障碍API实现全局鼠标交互回调?

在macOS上追踪全局鼠标移动的方案

当然有办法实现!在macOS/Swift生态里,你可以通过系统级事件监听和无障碍API来实现全局鼠标追踪,不管你的应用是否处于焦点状态,甚至可以做成托盘/后台服务应用。下面分具体方案和代码示例来讲解:

一、使用NSEvent全局事件监听(最简便的方式)

NSEvent提供了全局事件监听的API,能捕获系统范围内的鼠标移动、点击等事件,不过需要用户授予辅助功能权限(这是系统安全要求,无法绕过)。

核心步骤:

  1. 在应用的Info.plist中添加NSAccessibilityUsageDescription键,说明为什么需要辅助功能权限(比如"需要追踪鼠标移动以提供XXX功能"),否则用户看不到权限申请提示。
  2. 使用addGlobalMonitorForEvents(matching:handler:)方法注册全局监听,指定监听鼠标移动事件.mouseMoved。

Swift代码示例:

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
    var statusItem: NSStatusItem!

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        // 初始化托盘图标,把应用做成后台托盘应用
        statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength)
        if let button = statusItem.button {
            button.image = NSImage(systemSymbolName: "mouse.fill", accessibilityDescription: "鼠标追踪")
        }

        // 注册全局鼠标移动监听
        NSEvent.addGlobalMonitorForEvents(matching: .mouseMoved) { event in
            print("鼠标位置:\(event.locationInWindow),全局位置:\(NSEvent.mouseLocation)")
            // 这里写你的回调逻辑,比如记录坐标、触发自定义操作
        }

        // 如果需要监听鼠标点击,可以添加:
        // NSEvent.addGlobalMonitorForEvents(matching: .leftMouseDown) { event in
        //     print("左键点击:\(event.locationInWindow)")
        // }
    }

    func applicationWillTerminate(_ aNotification: Notification) {
        // 移除监听(可选,应用退出时系统会自动清理)
        NSEvent.removeMonitor(NSEvent.addGlobalMonitorForEvents(matching: .mouseMoved, handler: { _ in }))
    }
}

权限配置:

运行应用后,系统会弹出权限申请提示,或者你需要手动打开系统偏好设置 > 安全性与隐私 > 隐私 > 辅助功能,找到你的应用并勾选授权。

二、使用无障碍API(更底层的控制)

如果你需要更精细的控制(比如追踪其他应用的UI元素交互),可以用macOS的Accessibility API,这也是系统级的,同样需要辅助功能权限。

Swift代码示例(监听全局鼠标事件):

import Cocoa
import Accessibility

class AccessibilityMonitor {
    func startMonitoring() {
        let systemElement = AXUIElementCreateSystemWide()
        var observer: AXObserver?

        // 创建观察者
        AXObserverCreate(CGMainDisplayID(), { (observer, element, notification, userInfo) in
            if notification == kAXMouseMovedNotification as CFString {
                let mouseLocation = NSEvent.mouseLocation
                print("无障碍API捕获鼠标移动:\(mouseLocation)")
            }
        }, &observer)

        guard let observer = observer else { return }

        // 添加鼠标移动通知监听
        AXObserverAddNotification(observer, systemElement, kAXMouseMovedNotification as CFString, nil)

        // 加入RunLoop保持监听
        CFRunLoopAddSource(CFRunLoopGetCurrent(), AXObserverGetRunLoopSource(observer), .commonModes)
    }
}

// 在AppDelegate中调用
func applicationDidFinishLaunching(_ aNotification: Notification) {
    let monitor = AccessibilityMonitor()
    monitor.startMonitoring()
    // 同样需要辅助功能权限
}

三、把应用做成后台服务/托盘应用

要让应用在后台运行,不显示Dock图标,可以修改应用的激活策略:

在AppDelegate的applicationDidFinishLaunching里添加:

NSApp.setActivationPolicy(.accessory)
// 或者用.prohibited,完全隐藏应用界面,只保留托盘图标
// NSApp.setActivationPolicy(.prohibited)

这样应用就会在后台运行,只有状态栏的托盘图标可见,不会抢占焦点,同时能持续监听全局鼠标事件。

注意事项

  • 权限是必须的:macOS的安全机制要求这类全局事件监听必须获得用户的辅助功能授权,无法绕过,所以一定要在Info.plist中添加权限说明,否则用户会拒绝授权。
  • 性能考量:全局事件监听会持续触发回调,尽量在回调里做轻量操作,避免影响系统性能。
  • 沙箱限制:如果你的应用开启了App Sandbox,需要在沙箱设置中勾选"辅助功能"权限,否则无法使用全局监听。

内容的提问来源于stack exchange,提问作者mixtly87

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 15:02:31