如何在MacOS中使用Cocoa以像素为单位找到插入位置的绝对值?

时间:2013-10-11 09:54:19

标签: macos cocoa

对于我正在使用的鼠标:

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

我可以将什么用于插入符?

2 个答案:

答案 0 :(得分:2)

首先是坏消息。

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

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

好消息是,Cocoa应用程序和部分 Carbon应用程序可能会通过辅助功能公开此内容。

用户需要在“系统偏好设置”中启用辅助设备。一旦满足该条件,您就可以使用辅助功能框架获取最前面的应用程序,获取其聚焦窗口,获取其聚焦视图,并获得其选择范围。

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

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

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

理论上(我还没试过),你应该能够将插入点的空范围转换为空的或接近空的矩形,其位置在垂直线的某个位置。插入点。

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


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

您可以在“辅助功能工具”磁盘映像中从the Developer Downloads page获取它。


如果你想要关注一个窗口,伪造一个鼠标事件来点击它是一个坏主意 - 如果你点击错误的东西就会发生任何事情。请改为发送kAXRaiseAction操作窗口。

如果你想设置一个文本视图的插入点(并且想要找到你需要伪造一个鼠标事件点击以将其设置在所需位置的位置),那么这又是一个坏事这样做的方式。请改为设置视图的kAXSelectedTextRangesAttribute属性。同样,插入点是一个空的范围。

答案 1 :(得分:0)

你有这样的尝试吗?

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