CocoaまたはCarbonを使用して画面上の単語のフレーム(位置とサイズ)を見つける
-
22-07-2019 - |
質問
これは難しいものです:
画面上の単語の位置とサイズ(そのフレーム)を見つけることができる必要があります(最初の出現で十分です。そこから次のものを取得できるはずです)。
たとえば、SafariなどのWord、Excel、PowerPoint for Mac(およびこれらに限定されません)で単語の位置を検出できるようにしたいと思います。
解決策は可能な限り高速でなければなりません。少なくとも1秒間に5〜6ワードを見つけ、できるだけ少ないCPU時間を使用できるはずです。
これまで私が考えていたことは次のとおりです。
- ウィンドウのスクリーンショット/グラフィックコンテキストでのOCR(Mac OS X 10.4で動作し、商用製品で使用できる優れたオープンソースフレームワーク?)。 Evernoteは、画像内の単語を見つけるのに非常に優れています。カスタムの社内エンジンを使用するのか、オープンソース/商用エンジンを使用するのかはわかりませんが、これが「有効な」場合に使用したい種類のエンジンです溶液。理想的には、アクティブなアプリケーションのウィンドウで単語のフレームを検出します(別のアプリケーションのフレームを取得する方法)。
- 何らかの「フック」を取得するQuartzによるテキストの描画と、描画された単語の位置のインターセプト(一見したところ、実行可能性はあまり高くありません!)。
- AppleScript。ただし、アプリケーションが提供するAPIに大きく依存し(私が見たものからWord文書で単語の座標を取得できるとは思わない)、それは遅い。
- ...アイデアのうち...
私の目標は、段落のテキストを含む文字列に基づいて、段落内のすべての単語のフレームを正しい順序で取得することです。
ヒントをお寄せいただきありがとうございます!
解決
出発点として、QuickCursorのコードをご覧ください。 a>。 AXアクセシビリティAPI 。これで、単語のピクセル配置を取得できなくなりますが、少なくともそのUI要素内のテキストに関連付けられたNSStringを返します。もちろんこれは、問題のアプリがこれらのAPIをサポートする必要があることを意味します。 MS Officeスイートがそうするかどうかはわかりません。さらに、編集可能な要素のみをサポートしているため、Safariで編集できないWebページも機能しません。しかし、いくつかのアイデアの出発点になるかもしれません。
QCUIElement。{m、h}
を見てから、 QCAppDelegate.m
( beginQuickCursorEdit:
)の実装を見てください。 ...抽象化されたQCUIElementの実装は次のように単純なようです:
QCUIElement *focusedElement = [QCUIElement focusedElement];
id value = focusedElement.value;
編集:ああ! Accessibility Inspectorサンプルコードを確認してください: UIElementInspector 。実際にページ上の要素のAXPositionを取得できます。今、それは単語ごとではありませんが、私たちは近づいています。テキストブロックのX、Y配置、およびテキストブロックに含まれる単語がわかります。
他のヒント
これは可能ですが、確実に動作させるのは非常に困難です。 スペルキャッチャーの直接接続で遊ぶことができます。例をご覧ください。