4

現在ウィンドウ リストの一番上にある Finder ウィンドウの POSIX パスを取得するにはどうすればよいですか? できればある種の Cocoa フレームワークを使用しますが、私は何に対してもオープンです。

背景: このパスから再帰的に開始して、正規表現パターンに一致するファイルを選択したいので、これが必要です。アイデアは、使用することです

[[NSWorkspace sharedWorkspace] subpathsAtPath:thePath]

メソッドを使用してこのパスのすべての子孫を取得し、NSTask で「grep」を使用して (正規表現サポート フレームワークのパッケージ化を回避するため)、次を使用します。

[[NSWorkspace sharedWorkspace] selectFile:aFile inFileViewerRootedAtPath:thePath]

grep によって返されたエントリから作成された NSArray をループするループ内。

これまで、NSWorkspace、NSFileManager、NSApplication に加えて、Xcode ドキュメント内の他のキーワード検索を見てきました。

私の質問をチェックしてくれてありがとう!

アンドレ

PS: grep の部分についてはよくわかりません。おそらく RegexKit Lite をそこに平手打ちします...

4

4 に答える 4

5

おそらく、AppleScript を介してこれを Finder に問い合わせることができます。

この*ワンライナーは私のために働きます:

osascript -e 'tell application "Finder" to set myname to POSIX path of (target of window 1 as alias)'

*これの修正版。

于 2009-06-26T12:25:26.073 に答える
3

私はあなたが説明したことを正確に行う商用アプリケーションを開発しており、これを行うさまざまな方法を1年以上いじっています。私は初心者の開発者なので、私の方法よりもはるかに優れた方法があるかもしれないという考えを完全に受け入れていますが、安定していて機能しているようです。

Appleスクリプトを使用しています

アクティブなドキュメントのパスを 3 秒ごとに取得しますが、アクティブなアプリケーションが Finder の場合は、アクティブなウィンドウのパスを取得します。受け入れられた回答で説明されているように、Apple Scriptを使用してこれを行います。

Carbon を使用してウィンドウ リストを取得する

すべてのプロセスのウィンドウ リストを取得してウィンドウ ID を取得するには (Apple Script ではできないこと)、この質問で詳しく説明されているように CGWindowListCopyWindowInfo を使用します。

別のアプリケーションのウィンドウの一意の ID を取得する

これにより、すべてのプロセスのすべてのウィンドウが最前面に並べられた配列が表示されます。したがって、配列から最初のエントリを取得するだけです。これは、Son of Grab サンプル アプリケーションに示されているように、フロント ウィンドウのスクリーン グラブを取得するためにも使用できます。

Cocoa から Apple Script を送信する

Apple Script に関しては、Jim が提案する 3 つすべてを試してみましたが、私の結論は、安定性と柔軟性の両方の点で、それぞれに問題があるということです。

  1. Apple Event Manager は、生の Apple Events を送信することに依存しています。私にとって、これはあまりにもハードワークのようで、レベルが低すぎました。

  2. NSAppleScript を使用すると、速度が遅く、エラーが発生しやすいことがわかりました。また、私のようにさまざまな Apple Script メッセージを送信したい場合も、かなり扱いにくいものです。

  3. Scripting Bridge について読んだとき、私は非常に興奮しましたが、実際に試してみて非常にがっかりしました。取得しようとしていたウィンドウの属性については、それらが存在することさえ認識しませんでした。バグがあって奇妙に思えました。送信しているコマンドが SB でサポートされている場合、それが最適なオプションになると思います。

4 番目のオプション

私は今、 AppScriptと呼ばれる Apple Script の優れた Objective C ラッパーに依存しています。それは何年も前から存在しており、安定しており、開発者は素晴らしく、何よりもうまく機能しています。

Apple Script を送信できる堅実なメソッドがあり、エラーをチェックする必要がある可能性のあるバグや厄介なコードを大量にロードすることなく、きちんとエラーを返すことさえあります。

1年使っていますが、今のところ問題ありません。これを行う方法について他に質問がある場合は、遠慮なくコメントしてください。できる限りお答えします。

于 2009-10-16T10:37:24.377 に答える
2

Finder の最前面のウィンドウで表される POSIX パスを取得するには、何らかの方法で Apple Events を Finder に送信する必要があります。

選択肢は次のとおりです。

  • Apple Event Manager (または NSAppleEventDescriptor など) を直接使用する。
  • NSAppleScript または OSAScript オブジェクトの使用。
  • ScriptingBridge の使用。

Cocoa アプリを構築している場合、OSAScript がおそらく最も自然な選択です。

于 2009-06-26T15:29:09.663 に答える