使用Cocoa或Carbon在屏幕上查找单词的框架(位置和大小)

时间:2009-10-30 19:50:07

标签: objective-c cocoa ocr macos-carbon

这是一个艰难的:

我需要能够在屏幕上找到一个单词的位置和大小(它的框架)(它的第一次出现是足够的,从那里我应该可以得到下一个)。

例如,我希望能够在(但不限于)Word,Excel和PowerPoint for Mac以及Safari和其他人中检测单词位置。

解决方案应该尽可能快;我应该能够找到每秒至少5-6个字,并尽可能少地使用CPU时间。

这是我到目前为止的想法:

  • OCR在窗口的截图/图形上下文中(任何适用于Mac OS X 10.4并且可以在商业产品中使用的开源框架)。 Evernote非常善于发现图像中的文字。我不知道它是使用自定义内部引擎还是开源/商用引擎,但如果这是一个“有效”的解决方案,那将是我想要使用的那种引擎。理想情况下,我会在活动应用程序的窗口中检测单词的框架(如何获取另一个应用程序的框架?)。
  • 在Quartz绘制文本时获取某种“钩子”并在绘制时截取单词的位置(乍一看似乎不太可行!)。
  • AppleScript,但它在很大程度上取决于应用程序提供的API(我不认为你可以从我看到的Word文档中获得单词的坐标)而且它是
  • ...出于想法......

我的目标是根据包含段落文本的字符串,以正确的顺序获取段落中的所有单词框架。

提前感谢任何提示!

2 个答案:

答案 0 :(得分:2)

作为起点,您可能需要查看QuickCursor's code。它通过AX Accessibility APIs从许多不同的应用程序中检索文本。现在,它不会抓取单词的像素位置,但它至少会返回与该UI元素中的文本关联的NSString。当然,这意味着有问题的应用程序必须支持这些API;我不知道MS Office套件会不会。此外,它仅支持可编辑元素,因此Safari中不可编辑的网页也不起作用。但它可能会为你提供一些想法的起点。

查看QCUIElement.{m,h},然后查看QCAppDelegate.mbeginQuickCursorEdit:)中的实现......他抽象的QCUIElement的实现似乎很简单:

QCUIElement *focusedElement = [QCUIElement focusedElement];
id value = focusedElement.value;

修改:啊哈!查看辅助功能检查器示例代码:UIElementInspector。它实际上可以在页面上获取元素的AXPosition。现在,它不是逐字逐句,而是我们越来越近了。它会告诉你文本块的x,y位置,以及文本块中包含的单词。

答案 1 :(得分:1)

这是可能的,但很难可靠地工作。您可以使用Spell Catcher's Direct Connect功能来查看示例。