在MacOS上实现“鼠标跟随焦点”

8
我有多个显示器,当在不同应用程序之间切换时,通常比使用鼠标更快捷,因此我倾向于使用键盘快捷键来管理/导航窗口。但是有时需要鼠标。我的问题是,当我更改活动窗口时,我的鼠标可能在任何一个当前屏幕上,所以我必须先找到它,然后拖动指针到需要点击的位置。
我想要的是:
A)当我通过cmd-Tab切换活动窗口时,将鼠标移动到活动窗口的中心。
B)如果需要,有一个快速调用鼠标指针到活动窗口的键盘快捷键。
我已经发现了许多支持FFM的“黑客”和应用程序,但我想要的是MFF。有人知道如何做到这一点吗?
1个回答

3
基本概念相对简单,但实现上有些怪异。以下脚本可满足(A)中的需求,但需要注意它无法区分应用程序被如何打开。每当应用程序变为活动状态(通过cmd-tab、点击Dock图标、双击应用程序图标等)时,它将运行,并在没有打开窗口或出现其他错误情况时静默失败。
将以下脚本复制到脚本编辑器中,并将其保存为“保持打开”应用程序(从文件格式下拉菜单中选择“应用程序”,并勾选“运行处理程序后保持打开”复选框)。您需要在安全性偏好设置中授予其辅助功能权限,并且每次编辑脚本应用程序时都需要切换这些权限的状态。
use AppleScript version "2.4"
use framework "AppKit"
use scripting additions

property NSWorkspace : class "NSWorkspace"

on run
    set workSp to NSWorkspace's sharedWorkspace()
    set notifCent to workSp's notificationCenter()
    tell notifCent to addObserver:me selector:"activeAppHasChanged:" |name|:"NSWorkspaceDidActivateApplicationNotification" object:(missing value)
end run

on idle
    -- we don't use the idle loop, so tell the system let the app sleep. this comes out of idle once an hour
    return 3600
end idle

on activeAppHasChanged:notif
    set targetApp to (notif's userInfo's valueForKey:"NSWorkspaceApplicationKey")
    set targetAppName to (targetApp's localizedName) as text
    tell application "System Events"
        tell process targetAppName
            try
                set {xpos, ypos} to position of first window
                set {w, h} to size of first window
                my mouseMove(xpos + w / 2, ypos + h / 2)
            end try
        end tell
    end tell
end activeAppHasChanged:

on mouseMove(newX, newY)
    do shell script "
    
/usr/bin/python <<END

from Quartz.CoreGraphics import CGEventCreateMouseEvent
from Quartz.CoreGraphics import CGEventPost
from Quartz.CoreGraphics import kCGMouseButtonLeft
from Quartz.CoreGraphics import kCGHIDEventTap
from Quartz.CoreGraphics import kCGEventMouseMoved
import time

def mouseEvent(posx, posy):
          theEvent = CGEventCreateMouseEvent(None, kCGEventMouseMoved, (posx,posy), kCGMouseButtonLeft)
          CGEventPost(kCGHIDEventTap, theEvent)

mouseEvent(" & newX & "," & newY & ");

END"
end mouseMove

运行脚本并让它在后台运行。每次您切换应用程序时,它都会将光标居中在该应用程序的第一个打开的窗口中。如果您更喜欢选项(B)-使用键盘快捷键的方法也可以实现,但这是一种稍微不同的方法。如果需要帮助实施,请提出要求。


1
谢谢提供脚本!到目前为止,一切都很好。可能会有一些延迟,因为它要执行Python代码,并且像您提到的那样会产生一些副作用(例如,如果我通过单击窗口来切换,它将在该窗口上重新定位鼠标)。我可以通过检查当前鼠标位置是否已经在x、y、w、h位置内来解决鼠标问题,并且只有在不在时才移动。但这是一个很好的开始! - Paul
1
我认为延迟可能来自于NSWorkspace通知;通知是惰性投递的。如果我没记错的话,运行一个不使用通知(即手动设置鼠标位置)的脚本版本几乎没有延迟。但是,你知道...AppleScript是只驴子,而不是赛马;我们不能期望它像飞一样快。 - Ted Wrigley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接