作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我通过 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
(因为它是针对不同的应用程序),因此 NSEvent
的 locationInWindow
使用以原点为基础的 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/
我是一名优秀的程序员,十分优秀!