For mouse I'm using:
ourEvent = CGEventCreate(None);
currentpos = CGEventGetLocation(ourEvent);
What can I use for the caret?
首先是坏消息。
并非每个应用程序都是基于 Cocoa 的,那些既不是 Cocoa 也不是 Carbon 也不是两者的直接混合的应用程序(即基于 wxWidgets、Qt 或其他跨平台框架的应用程序)通常会在其之上重新实现整个 GUI 堆栈原始事件和绘图原语。
这意味着通常无法从这些应用程序中获取此信息(除非它们是可编写脚本并以这种方式公开的)。
好消息是,Cocoa 应用程序和一些Carbon 应用程序可能会通过 Accessibility 暴露这一点。
用户需要在“系统偏好设置”中打开辅助设备。一旦满足该条件,您就可以使用 Accessibility 框架来获取最前面的应用程序、获取其焦点窗口、获取其焦点视图并获取其选择范围。
带有插入点的文本视图只有一个选择范围,并且该范围为空(长度=0)。位置是插入点所在的位置。
当然,这些是字符索引,而不是屏幕边界。
这就是参数化属性的用武之地。有一个用于将范围转换为边界。那就是你想要的那个。
理论上(我没有尝试过),您应该能够将插入点的空范围转换为空的或几乎空的矩形,其位置位于插入点的垂直线内。
确保使用滚动视图中的文本视图对此进行测试,特别是当插入点部分或完全滚动到视图之外时。
您将希望使用 Accessibility Inspector 亲自查看您的应用程序需要查看的位置,并测试单个应用程序并调查报告的故障。
您可以从“辅助工具”磁盘映像中的“开发者下载”页面获取它。
如果你想聚焦一个窗口,伪造一个鼠标事件来点击它是一个坏主意——如果你点击了错误的东西,任何事情都可能发生。kAXRaiseAction
而是向窗口发送一个动作。
如果您想设置文本视图的插入点(并且正在寻找需要伪造鼠标事件以单击以将其设置在所需位置的位置),那么这又是一种不好的方法。改为设置视图的kAXSelectedTextRangesAttribute
属性。同样,插入点是一个空范围。
你在下面尝试过吗?
NSPoint p=[[NSApp currentEvent]locationInWindow];
CGFloat X=p.x;
CGFloat Y=p.y;
NSLog(@"%f %f",X,Y);