Objective c 如何在cocoa中获取鼠标单击事件元素
我通过macOS中的全局监视器接收点击事件。 NSEvent给我坐标,但我需要得到UIElement 使用可访问性API,我可以获得焦点元素,但我需要完全不同的clicked元素。例如,如果我单击一个textarea,就会得到一个AXTextArea元素。如果我单击应用程序任务栏,焦点元素仍然是AXTextArea,这是有意义的。我想要与鼠标事件关联的元素 我在web上发现了一个名为accessibilityHitTest的方法,该方法应该在给定的NSPoint下检索UIElement。我总是得到空值,所以我不确定这是不是应该这样工作 也许还有另一个函数可以从屏幕中的给定点检索UIElement 以下是我尝试过的: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。我总是得
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()
。