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

标签 objective-c macos cocoa accessibility

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

使用辅助功能 API,我可以获得焦点元素,但我需要完全不同的单击元素。例如,如果我单击文本区域,我会得到 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。

最佳答案

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

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

关于objective-c - 我如何在 cocoa 中获取鼠标单击事件元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56082519/

相关文章:

objective-c - 在委托(delegate)中初始化自定义对象

iphone - 以编程方式为单个 UITableViewCell 设置高度?

objective-c - 如何以编程方式获取 OS X 中上次系统启动/重新启动的持续时间?

ios - SpriteKit Jitters 并设置常量和 "per second"PhysicBody 速度

ios - 重新启动 Xcode 加载 Xcode 片段

c - C 中的重音/变音字符?

linux - Linux (centos) 上的 DMG 处理

objective-c - Cocoa:源列表数据上的上下文菜单 - 不是标题

ios - MVC : Is a custom UITableViewCell a view or controller or both?

objective-c - iOS >> 单独的 .h&.m 文件来管理 UITableView