You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Mac鼠标穿透脚本开发:寻求不受窗口层级限制的点击方案

绕开窗口层级限制的Mac鼠标模拟方案

我之前也遇到过类似的问题——想用遥控器控制音乐,结果各种模拟点击的方案都卡在窗口层级上,AppleScript报错更是家常便饭。给你几个完全绕开窗口/应用层级限制的方案,都是直接在系统底层模拟鼠标操作,就像你真的用鼠标点一样:

方案1:用Python + Quartz Event Services(底层API)

Quartz是Mac的核心图形服务,它的Event Services可以直接生成硬件级别的鼠标事件,完全不关心当前哪个窗口在前台。你可以用Python的pyobjc绑定来调用这个API,代码简单易写:

首先安装依赖:

pip install pyobjc

然后写脚本实现鼠标移动和点击:

from Quartz.CoreGraphics import (
    CGEventCreateMouseEvent,
    CGEventPost,
    kCGEventMouseMoved,
    kCGEventLeftMouseDown,
    kCGEventLeftMouseUp,
    kCGMouseButtonLeft,
    kCGHIDEventTap
)

def move_mouse(x, y):
    # 创建鼠标移动事件并发送
    event = CGEventCreateMouseEvent(None, kCGEventMouseMoved, (x, y), kCGMouseButtonLeft)
    CGEventPost(kCGHIDEventTap, event)

def click_mouse(x, y):
    # 先移动到目标坐标
    move_mouse(x, y)
    # 发送左键按下事件
    down_event = CGEventCreateMouseEvent(None, kCGEventLeftMouseDown, (x, y), kCGMouseButtonLeft)
    CGEventPost(kCGHIDEventTap, down_event)
    # 发送左键松开事件(模拟完整点击)
    up_event = CGEventCreateMouseEvent(None, kCGEventLeftMouseUp, (x, y), kCGMouseButtonLeft)
    CGEventPost(kCGHIDEventTap, up_event)

# 示例:点击屏幕(200, 300)的位置
click_mouse(200, 300)

注意:运行脚本前,需要在「系统偏好设置 → 安全性与隐私 → 隐私 → 辅助功能」里,给运行脚本的终端/IDE授予权限,否则会报错。

方案2:用Hammerspoon(自动化工具,适合绑定遥控器)

Hammerspoon是Mac上专门做全局自动化的工具,用Lua脚本编写,它的事件模拟功能同样绕开了窗口层级,而且可以直接把遥控器按键映射成操作——毕竟大部分遥控器都可以被系统识别为键盘热键。

先安装Hammerspoon,然后在~/.hammerspoon/init.lua里添加脚本:

-- 定义点击指定坐标的函数
function clickAt(x, y)
    -- 移动鼠标到目标位置
    hs.mouse.setAbsolutePosition({x = x, y = y})
    -- 模拟左键按下
    hs.eventtap.event.newMouseEvent(hs.eventtap.event.types.leftMouseDown, {x = x, y = y}):post()
    -- 模拟短暂延迟(模拟真实点击的按下时长)
    hs.timer.usleep(10000)
    -- 模拟左键松开
    hs.eventtap.event.newMouseEvent(hs.eventtap.event.types.leftMouseUp, {x = x, y = y}):post()
end

-- 绑定遥控器按键到点击操作(假设遥控器某键被系统识别为F13)
hs.hotkey.bind({}, 'f13', function()
    clickAt(200, 300) -- 替换成你需要点击的坐标
end)

优势:Hammerspoon不仅能模拟鼠标,还能直接控制音乐应用(比如hs.itunes.play()hs.spotify.pause()),如果你的需求只是控制音乐,甚至可以跳过鼠标模拟直接调用应用API,更可靠。同样需要给Hammerspoon授予辅助功能权限。

为什么之前的方案会失败?

  • AppleScript是基于应用脚本模型,必须目标应用处于可脚本化状态、且能被系统访问(比如前台或有脚本权限),所以会因为窗口层级、应用未响应等问题报错。
  • MouseTools部分版本依赖窗口聚焦,无法做到全局模拟。
  • MouseKeys是辅助功能的转键工具,本质是把键盘输入转成鼠标操作,配置复杂且灵活性不足。

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

火山引擎 最新活动