私はあなたが説明したことを正確に行う商用アプリケーションを開発しており、これを行うさまざまな方法を1年以上いじっています。私は初心者の開発者なので、私の方法よりもはるかに優れた方法があるかもしれないという考えを完全に受け入れていますが、安定していて機能しているようです。
Appleスクリプトを使用しています
アクティブなドキュメントのパスを 3 秒ごとに取得しますが、アクティブなアプリケーションが Finder の場合は、アクティブなウィンドウのパスを取得します。受け入れられた回答で説明されているように、Apple Scriptを使用してこれを行います。
Carbon を使用してウィンドウ リストを取得する
すべてのプロセスのウィンドウ リストを取得してウィンドウ ID を取得するには (Apple Script ではできないこと)、この質問で詳しく説明されているように CGWindowListCopyWindowInfo を使用します。
別のアプリケーションのウィンドウの一意の ID を取得する
これにより、すべてのプロセスのすべてのウィンドウが最前面に並べられた配列が表示されます。したがって、配列から最初のエントリを取得するだけです。これは、Son of Grab サンプル アプリケーションに示されているように、フロント ウィンドウのスクリーン グラブを取得するためにも使用できます。
Cocoa から Apple Script を送信する
Apple Script に関しては、Jim が提案する 3 つすべてを試してみましたが、私の結論は、安定性と柔軟性の両方の点で、それぞれに問題があるということです。
Apple Event Manager は、生の Apple Events を送信することに依存しています。私にとって、これはあまりにもハードワークのようで、レベルが低すぎました。
NSAppleScript を使用すると、速度が遅く、エラーが発生しやすいことがわかりました。また、私のようにさまざまな Apple Script メッセージを送信したい場合も、かなり扱いにくいものです。
Scripting Bridge について読んだとき、私は非常に興奮しましたが、実際に試してみて非常にがっかりしました。取得しようとしていたウィンドウの属性については、それらが存在することさえ認識しませんでした。バグがあって奇妙に思えました。送信しているコマンドが SB でサポートされている場合、それが最適なオプションになると思います。
4 番目のオプション
私は今、 AppScriptと呼ばれる Apple Script の優れた Objective C ラッパーに依存しています。それは何年も前から存在しており、安定しており、開発者は素晴らしく、何よりもうまく機能しています。
Apple Script を送信できる堅実なメソッドがあり、エラーをチェックする必要がある可能性のあるバグや厄介なコードを大量にロードすることなく、きちんとエラーを返すことさえあります。
1年使っていますが、今のところ問題ありません。これを行う方法について他に質問がある場合は、遠慮なくコメントしてください。できる限りお答えします。