1

[1] アプリ内の任意のテキストを選択して右クリックすると、Servicesクリックして のようなサービスを呼び出すことができるメニューが表示されますSearch With Google

クリックするとNSPasteboard、選択したテキストを含むオブジェクトがサービスに自動的に送信されます。

[2] サード パーティのアプリは、このBOOL NSPerformService ( NSString *itemName, NSPasteboard *pboard )関数を使用して、任意のサービスをプログラムで呼び出すことができます。

ここで、アプリはNSPasteboardサービスに送信されるオブジェクトを設定する必要があります。


オブジェクトを設定せずにプログラムでサービスを呼び出す方法はありますかNSPasteboard(NSPasteboardオブジェクトには [1] のように選択されたテキストが自動的に含まれる必要があります)。

NSPasteboard選択されたテキストを含むオブジェクトは、[1] で OS X によってサービスにどのように送信されますか? プライベート API はありますか?

4

1 に答える 1

3

これは、サービス実装ガイド、特にサービスの使用の章に記載されています。

まず、ユーザーが [サービス] メニューを開くと、Cocoa は-validRequestorForSendType:returnType:レスポンダー チェーン内のオブジェクトを呼び出して、現在の状態 (現在の選択など) に基づいて、送信タイプと戻りタイプのどの組み合わせをどのオブジェクトで処理できるかを判断します。 . これは、どのサービス メニュー項目を有効にするかを制御します。

ユーザーがサービス メニュー項目を選択すると、Cocoa はペーストボードを作成し、-writeSelectionToPasteboard:types:によって返されたリクエスタ オブジェクトを呼び出します-validRequestorForSendType:returnType:。そのオブジェクトは、サポートされているタイプのいずれかで、提供されたペーストボードに選択データを配置する必要があります。

その後、Cocoa はペーストボードをシステムに渡します。システムは、サービス プロバイダー プロセスで Cocoa と通信します。Cocoa は-<messageName>:userData:error:、そのプロセスのサービス プロバイダー オブジェクトを呼び出し<messageName>ます。これは、そのアプリの Info.plist ファイル内のサービスの説明に由来します。サービス プロバイダー オブジェクトは、アプリが を使用して Cocoa に登録したものですNSRegisterServicesProvider()

サービス プロバイダーは、ペーストボードからの入力データがある場合はそれを処理し、返されたデータがある場合はペーストボードに格納します。

プロバイダーが完了すると、元のアプリの Cocoa が-readSelectionFromPasteboard:リクエスター オブジェクトを呼び出します。この場合も、ペーストボードがそのメソッドに提供されます。

于 2015-02-28T21:41:15.887 に答える