Objective c 如何在cocoa中获取鼠标单击事件元素

Objective c 如何在cocoa中获取鼠标单击事件元素,objective-c,macos,cocoa,accessibility,Objective C,Macos,Cocoa,Accessibility,我通过macOS中的全局监视器接收点击事件。 NSEvent给我坐标,但我需要得到UIElement 使用可访问性API,我可以获得焦点元素,但我需要完全不同的clicked元素。例如,如果我单击一个textarea,就会得到一个AXTextArea元素。如果我单击应用程序任务栏,焦点元素仍然是AXTextArea,这是有意义的。我想要与鼠标事件关联的元素 我在web上发现了一个名为accessibilityHitTest的方法,该方法应该在给定的NSPoint下检索UIElement。我总是得

我通过macOS中的全局监视器接收点击事件。 NSEvent给我坐标,但我需要得到UIElement

使用可访问性API,我可以获得焦点元素,但我需要完全不同的clicked元素。例如,如果我单击一个textarea,就会得到一个AXTextArea元素。如果我单击应用程序任务栏,焦点元素仍然是AXTextArea,这是有意义的。我想要与鼠标事件关联的元素

我在web上发现了一个名为accessibilityHitTest的方法,该方法应该在给定的NSPoint下检索UIElement。我总是得到空值,所以我不确定这是不是应该这样工作

也许还有另一个函数可以从屏幕中的给定点检索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。

您需要使用它。请注意,您必须小心地在适当的坐标系中提供坐标。由于事件没有与关联的
窗口
(因为它用于不同的应用程序),
NSEvent
locationInWindow
使用Cocoa坐标系,原点位于主显示的左下角,
y
向上递增
AXUIElementCopyElementAtPosition()
获取核心图形坐标系中的坐标,原点位于主显示器的左上角,y向下递增。基本上,你会:

point.y = NSMaxY(NSScreen.screens[0].frame) - point.y;
你需要用这个。请注意,您必须小心地在适当的坐标系中提供坐标。由于事件没有与关联的
窗口
(因为它用于不同的应用程序),
NSEvent
locationInWindow
使用Cocoa坐标系,原点位于主显示的左下角,
y
向上递增
AXUIElementCopyElementAtPosition()
获取核心图形坐标系中的坐标,原点位于主显示器的左上角,y向下递增。基本上,你会:

point.y = NSMaxY(NSScreen.screens[0].frame) - point.y;

尝试点击测试主视图(Window.contentView)尝试点击测试主视图(Window.contentView)这太棒了,谢谢。我正在用NSLog打印uielement,我可以看到有一个PID值。您知道如何提取它吗?您可以使用
AXUIElementGetPid()
。这太棒了,谢谢。我正在用NSLog打印uielement,我可以看到有一个PID值。您知道如何提取它吗?您可以使用
AXUIElementGetPid()