如何在任意屏幕位置获取最前面的窗口?

问题描述 投票:0回答:1

在 macOS 中,我想制作一个脚本,将最前面的窗口(如果有)聚焦在任意屏幕坐标

(x, y)
,与该窗口所属的应用程序/进程无关。

这相当于在该位置上单击鼠标,但我只想激活/聚焦窗口,而不是触发任何鼠标单击事件(例如,目标窗口可能在我的这个位置有一个按钮)不想被点击)。因此,我有兴趣获取给定屏幕坐标处最前面窗口的句柄

(x, y)
,以便我可以通过编程方式将其聚焦。

有没有办法在 AppleScript、Swift 或 Python 中做到这一点?

swift macos applescript window-management
1个回答
0
投票
这在 Swift 和 Accessibility API 中是可能的。

请注意,您的应用程序需要辅助权限才能执行此操作,因此无法沙箱化。通过

AXIsProcessTrustedWithOptions(_:)

查询权限

首先,使用

创建一个系统范围的可访问性对象

AXUIElementCreateSystemWide()
,

并使用

查询您坐标处最前面的可访问性对象

AXUIElementCopyElementAtPosition(_:_:_:_:)

这是第一步的示例:

func elementAtPosition(x: Float, y: Float) throws -> AXUIElement? {
    let systemwide = AXUIElementCreateSystemWide()
    var element: AXUIElement?
    let error = AXUIElementCopyElementAtPosition(systemwide, x, y, &element)
    if error != .success {
        throw error
    }
    return element
}

然后您需要递归地向下钻取 UI 层次结构,直到找到没有父元素的元素(返回 nil),即您的窗口元素。这是用

完成的

AXUIElementCopyAttributeValue(_:_:_:)

NSAccessibility.Attribute.parent
.

最后,使用

激活窗口元素

AXUIElementPerformAction(_:_:)

kAXRaiseAction
.

© www.soinside.com 2019 - 2024. All rights reserved.