如何在MacOS中使用Cocoa查找像素插入符号位置的绝对值



对于鼠标,我正在使用:

ourEvent = CGEventCreate(None);
currentpos = CGEventGetLocation(ourEvent);

我可以用什么作为插入符号?

首先是坏消息。

并非每个应用程序都是基于Cocoa的,而那些既不是Cocoa也不是Carbon的应用程序,也不是两者的直接混合,即那些基于wxWidgets,Qt或其他跨平台框架的应用程序,通常会在原始事件和绘图基元之上重新实现整个GUI堆栈。

这意味着通常无法从这些应用程序中获取此信息(除非它们是可编写脚本的并以这种方式公开它(。

好消息是,Cocoa应用程序和一些Carbon应用程序可能会通过Accessibility公开这一点。

用户需要在"系统偏好设置"中打开辅助设备。满足该条件后,可以使用辅助功能框架获取最前面的应用程序、获取其焦点窗口、获取其焦点视图并获取其选择范围。

具有插入点的文本视图只有一个选择范围,并且该区域为空(长度 = 0(。位置是插入点所在的位置。

当然,这些是字符索引,而不是屏幕上的边界。

这就是参数化属性的用武之地。有一个用于将范围转换为边界。这就是你想要的。

从理论上讲(我还没有尝试过这个(,您应该能够将插入点的空白范围转换为一个空的或接近空的矩形,其位置在插入点的垂直线内的某个地方。

请确保使用滚动视图中的文本视图对此进行测试,尤其是在插入点部分或完全滚动到视图之外时。


您需要使用辅助功能检查器亲自查看应用程序需要查找的位置,并测试各个应用程序并调查报告的故障。

您可以从"开发者下载"页面的"辅助功能工具"磁盘映像中获取它。


如果你想聚焦一个窗口,伪造一个鼠标事件来点击它是一个坏主意——如果你点击错误的东西,任何事情都可能发生。改为向窗口发送kAXRaiseAction操作。

如果要设置文本视图的插入点(并且正在寻找需要伪造鼠标事件以单击以将其设置在所需位置的位置(,同样,这是一种糟糕的方法。请改为设置视图的kAXSelectedTextRangesAttribute属性。同样,插入点是单个空白区域。

你在下面试过吗?

NSPoint p=[[NSApp currentEvent]locationInWindow];
CGFloat X=p.x;
CGFloat Y=p.y;
NSLog(@"%f %f",X,Y);

最新更新