objective-c - 如何在可可中获取鼠标单击事件元素
问题描述
我在 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。
解决方案
您需要为此使用AXUIElementCopyElementAtPosition()
。请注意,您必须小心在正确的坐标系中提供坐标。window
由于事件与(因为它是针对不同的应用程序)没有关联,所以NSEvent
'slocationInWindow
使用 Cocoa 坐标系,原点位于主显示屏的左下方,y
向上方向增加。AXUIElementCopyElementAtPosition()
采用 Core Graphics 坐标系中的坐标,原点位于主显示器的左上角,y
向下递增。基本上,你这样做:
point.y = NSMaxY(NSScreen.screens[0].frame) - point.y;
推荐阅读
- javascript - 在 nextjs 中为多个设备使用 cookie
- snowflake-cloud-data-platform - 我如何知道 Snowflake 是否会创建新的 SQS 队列?
- c++ - 函数签名中的大小数组
- node.js - NodeJS - 处理内存数据的最佳实践?
- java - Spring IntegrationFlow imapInboundAdapter 在 getFolder 上获取 NullPointerException
- flutter - 断言失败:第 482 行 pos 12:'crossAxisExtent > 0.0':不正确
- flutter - youtube_explode_dart 包有错误的文档
- javascript - React.js 定位对象中的值
- typescript - 如何在 NextJS + TypeScript 设置中为 node_module 起别名?
- python - Python - 仅从文件夹中复制今天的照片