如何获取可可中的鼠标单击事件元素

时间:2019-05-10 17:46:39

标签: objective-c macos cocoa accessibility

我在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。

1 个答案:

答案 0 :(得分:2)

您需要为此使用AXUIElementCopyElementAtPosition()。请注意,必须小心在正确的坐标系中提供坐标。由于该事件没有与window相关联(因为它用于其他应用程序),因此NSEvent的{​​{1}}使用可可坐标系,其原点位于主显示的左下角,其中locationInWindow沿向上方向增加。 y在Core Graphics坐标系中获取坐标,其原点位于主显示的左上角,AXUIElementCopyElementAtPosition()向下递增。基本上,您可以这样做:

y