首页 > 解决方案 > 如何在可可中获取鼠标单击事件元素

问题描述

我在 macOS 中使用全局监视器接收来自点击的事件。NSEvent 给我坐标,但我需要获取 UIElement。

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

我在网上找到了一个名为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。

标签: objective-cmacoscocoaaccessibility

解决方案


您需要为此使用AXUIElementCopyElementAtPosition()。请注意,您必须小心在正确的坐标系中提供坐标。window由于事件与(因为它是针对不同的应用程序)没有关联,所以NSEvent'slocationInWindow使用 Cocoa 坐标系,原点位于主显示屏的左下方,y向上方向增加。AXUIElementCopyElementAtPosition()采用 Core Graphics 坐标系中的坐标,原点位于主显示器的左上角,y向下递增。基本上,你这样做:

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

推荐阅读