我在macOS中使用全局监视器从点击事件中接收事件。 NSEvent给我坐标,但是我需要获取UIElement。
使用可访问性API,我可以获取有重点的元素,但是我需要的clicked元素完全不同。例如,如果我单击一个textarea,则会得到一个AXTextArea元素。如果我单击应用程序任务栏,则聚焦的元素仍然是AXTextArea,这很有意义。我想要与鼠标事件关联的元素。
我在网上发现了一种称为accessibilityHitTest的方法,该方法应该在给定的NSPoint下检索UIElement。我总是会得到null,所以我不确定这是否可以正常工作。
也许还有另一个函数可以从屏幕上的给定点检索UIElement?
我在这里尝试过:
NSEvent *event; // My event received from global monitoring
id clickedObject = [self accessibilityHitTest:event.locationInWindow];
//This give me an error because self is not a NSWindow.
NSEvent *event; // My event received from global monitoring
id clickedObject =
[[NSApp keyWindow] accessibilityHitTest:event.locationInWindow];
//This give me null at every click.
也许这是不可能的,但我只是可以在鼠标单击下获得UIElement而不是聚焦的UIElement。
答案 0 :(得分:2)
您需要为此使用AXUIElementCopyElementAtPosition()
。请注意,必须小心在正确的坐标系中提供坐标。由于该事件没有与window
相关联(因为它用于其他应用程序),因此NSEvent
的{{1}}使用可可坐标系,其原点位于主显示的左下角,其中locationInWindow
沿向上方向增加。 y
在Core Graphics坐标系中获取坐标,其原点位于主显示的左上角,AXUIElementCopyElementAtPosition()
向下递增。基本上,您可以这样做:
y