ホーム > シルバー >シルバークリップボードAPI

SilverlightのクリップボードAPI

SilverlightでクリップボードAPI

Silverlightの4クリップボードのサポートを追加します。 でスコット·ガスリーとブライアンゴールドファーブによる素晴らしいデモ今日チェックして、PDC Silveilght4クリップボードのサポートでは有効になってシナリオを披露。

SilverlightののClipboard APIは、WPFのサブセットでのクリップボード API:

  パブリック静的クラスクリップボード 
{
パブリック静的ブール ContainsText();
パブリック静的文字列はGetText();
text); パブリック静的ボイド SetTextによって( 文字列テキスト );
}

これは、システムのクリップボードから/へのコピー/ペーストUnicode文字列を可能にする。 GetTextはとSetTextによっては成功するために、次のいずれかが必要です。

  1. 呼び出しSilverlightアプリケーションは、高い信頼アプリケーションであるか、
  2. それは、ユーザ開始され、ユーザー補助金のクリップボードへのアクセスである

第二のケースでは、GetTextはまたはSetTextによっては、最初のユーザーが開始イベント処理で呼び出されたときに、Silverlightは、以下の1(UIがRTWで変更される可能性)のようなダイアログがポップアップ表示されます:

    Clipboard Prompt
    ユーザーがはい]をクリックすると、Silverlightは、これを可能にし、後でGetTextは/ SetTextによっては、このセッション中に、このアプリケーションのために成功するために呼び出します。 ユーザーはなし、デフォルトをクリックすると、SilverlightはスローされますSecurityExceptionを 別の言葉では、設定が取得し、システムクリップボードへのアクセスを設定する両方のために、セッションごと、アプリケーションごとであり、それは保持されません。

JavaScriptとWPFでクリップボードAPI

私たちは、SilverlightのクリップボードAPIを設計する際、多くの要素を考慮する必要があります。 私たちは、JavaScriptのセキュリティレッスンを研究し、WPFとの互換性がしようとする必要があるため、これらの中では、JavaScriptとWPFのクリップボードAPIは、特に興味深い。

交差ブラウザ、クリップボードにアクセスするためのクロスプラットフォームのJavaScript APIはありません。 IEは提供は、clipboardDataのシステムクリップボード内の取得/セット/クリアの文字列を可能にするオブジェクトを:

bResult = window.clipboardData.setData(sDataFormat、です。sData);

です。sData = window.clipboardData.getData(sDataFormat);

bResult = window.clipboardData.clearData([sDataFormat]);

sDataFormatが「テキスト」または「URL」の文字列定数であり、SDATAが文字列で、bResultはブールです。

clipboadDataオブジェクトが最初にアクセスされたときは、IEは、スクリプトがクリップボードへのアクセスを許可するようにユーザーに促しますし、設定はセッションに対して有効です。

WPFのClipboard APIは、経由して、より拡張可能なデータ形式をサポートしているのIDataObject 、テキスト、イメージ、オーディオ、のような一般的なフォーマットのためのヘルパー関数を持っていfiledrop

  パブリック静的クラスクリップボード 
{
[SecurityCritical]
公共の静的な無効クリア();

パブリック静的ブール ContainsAudio();
format); パブリック静的ブール ContainsData( 文字列形式 );
パブリック静的ブール ContainsFileDropList();
パブリック静的ブール ContainsImage();
パブリック静的ブール ContainsText();
パブリック静的ブール ContainsText(TextDataFormat形式);
パブリック静的ストリームGetAudioStream();
format); パブリック静的オブジェクトのGetData( 文字列形式 );
[SecurityCritical]
パブリックstaticのIDataObject GetDataObject();
パブリック静的 StringCollection GetFileDropList();
パブリックstaticたBitmapSourceのGetImage();
パブリック静的文字列はGetText();
パブリック静的文字列はGetText(TextDataFormat形式);

パブリック静的ブール IsCurrent(のIDataObjectデータ);

[] audioBytes); パブリック静的ボイド SetAudio( バイト [] audioBytes);
パブリック静的ボイド SetAudio(ストリームaudioStream);
format, object data); パブリック静的ボイド SetDataメソッド( 文字列形式オブジェクトデータ );
[SecurityCritical]
data); パブリック静的ボイド SetDataObject( オブジェクトデータ );
[SecurityCritical]
data, bool copy); パブリック静的ボイド SetDataObject( オブジェクトデータブールコピー);
パブリック静的ボイド SetFileDropList(StringCollection fileDropList);
パブリック静的ボイド SetImage(たBitmapSource像);
text); パブリック静的ボイド SetTextによって( 文字列テキスト );
text, TextDataFormat format); 公共の静的な無効 SetTextによって( 文字列テキスト 、TextDataFormat形式);
}

WindowsとMac OS XのクリップボードAPI

SilverlightののクリップボードAPIは、最終的には、基礎となるオペレーティングシステムのクリップボードのAPIの上に実装されています。 WindowsのクリップボードAPIは 、MSDNで文書化され、抜粋、クリップボードのデータを取得/設定する方法の概要を説明します下:

カットし、コピー操作

クリップボードに情報を配置するには、ウィンドウが最初に使用して、以前のクリップボードの内容クリアするEmptyClipboardの機能を。 この関数は、送信しWM_DESTROYCLIPBOARDの 、以前のクリップボードの所有者にメッセージをクリップボード上のデータに関連付けられたリソースを解放し、オープンクリップボードを持つウィンドウにクリップボードの所有権を割り当てます。 クリップボードを所有するウィンドウを調べるには、呼び出しGetClipboardOwnerの機能を。

クリップボードを空にした後、可能な限り多くのクリップボード形式でクリップボード上のウィンドウの場所データは、少なくとも説明的に、ほとんどの記述クリップボード形式から注文しました。 各フォーマットの場合、ウィンドウは呼び出しSetClipboardDataのフォーマット識別子とグローバルメモリハンドルを指定して、関数を。 メモリハンドルは、ウィンドウがリクエストに応じてデータをレンダリングことを示す、NULLにすることができます。 詳細については、 遅延レンダリングを

ペースト操作

クリップボードから貼り付け情報を取得するには、ウィンドウが最初に取得するクリップボードフォーマットを決定します。 通常、ウィンドウは使用して使用可能なクリップボード形式を列挙EnumClipboardFormatsの機能を、それは認識して最初のフォーマットを使用しています。 このメソッドは、データがクリップボードに配置されたときに設定した優先順位に従って、利用可能な最良のフォーマットを選択する。

代わりに、ウィンドウが使用できるGetPriorityClipboardFormatの機能を。 この関数は、指定された優先度に応じて利用可能な最善のクリップボード形式を識別します。 唯一のクリップボード形式を認識するウィンドウは、単純にその形式が使用して利用可能であるかどうかを判断できIsClipboardFormatAvailable機能を。

使用するクリップボードフォーマットを決定した後、ウィンドウは呼び出しGetClipboardDataの機能。 この関数は、指定された形式のデータを含むグローバルメモリオブジェクトへのハンドルを返します。 ウィンドウには、簡単にデータを調べたり、コピーするために、メモリオブジェクトをロックすることができます。 ただし、ウィンドウは、オブジェクトを解放するか、長時間のロックされたままにしておくべきではありません。

今のところ、SilverlightのクリップボードAPIはサポートされていCF_UNICODETEXTのクリップボードへ/からのコピー/ペーストUnicodeテキストの書式を。

Mac OS Xは使用していますペーストボードマネージャを これで文書化されているMacのデベロッパーセンター (追加されたAPIを使用した)抜粋の下概要を示しています。

コピーアプリケーションは、ペーストボードにコピーまたは切り取ったデータを配置するための責任があります。

  1. ユーザーは、いくつかのデータを選択し、コピー(またはカット)メニュー項目を呼び出します。

  2. アプリケーションが既にクリップボードペーストへの参照を持っていない場合、1つ(作成PasteboardCreateに )。

  3. アプリケーションは、ペーストボードの所有権を取得し、現在の内容(クリアしPasteboardClearを )。

  4. アプリケーションは、選択したデータにアイテムIDを割り当てます。

  5. 任意のデータが約束される場合は、アプリケーションが約束されたデータ(供給する約束キーパーコールバック関数を登録する必要がありPasteboardSetPromiseKeeperを )。

  6. アプリケーションは、実際の味データや各フレーバー(と約束いずれかを含む、ペーストボードに各項目の一つ以上のフレーバーを追加しますPasteboardPutItemFlavor )。

受信側アプリケーションは、貼り付けアクションを処理するタスクのわずかに異なるセットがあります。

  1. アプリケーションがアクティブになったとき、それはペーストボードが(変更されているかどうかをチェックしPasteboardSynchronize )。 そうだとすれば、それはペーストボード上の味のリストを取得します。 任意のフレーバーアプリケーションがサポートがある場合、それはその貼り付けメニュー項目を有効にすることができます。

  2. ユーザーが貼り付け]メニュー項目を起動します。

  3. アプリケーションは、それがサポートするのフレーバーペーストボード上のアイテム(またはアイテム)を要求 ( PasteboardGetItemCount , PasteboardGetItemIdentifier , PasteboardCopyItemFlavors , PasteboardCopyItemFlavorData ).

  4. 貼り付けられたデータをファイルとして保存する場合、受信側アプリケーションは、任意の風味のデータを要求する前にペーストの場所を設定する必要がある。 それ以外の場合は、受信側アプリケーションは、ペーストデータが約束されたかどうかを心配する必要はありません。

コピーアプリの約束キーパーが呼び出されると、コールバックは、次の作業を行う必要があります。

  • データをファイルとして保存する場合、受信アプリケーションによって指定されたペースト位置を決定する。

  • 生成または他の方法で転送するために約束されたデータを準備する。

  • 約束されたデータをファイルとして保存することがされていない場合は、ペーストボードに風味やデータを追加する。 それ以外の場合は、指定されたファイルの場所に約束したデータを転送する。

アプリケーションの終了時に、それがもはやペーストボードを必要とするときにいくつかの時間後に、または、アプリケーションがペーストボードの参照を解放することはできません。

Windows上のように、SilverlightのクリップボードAPIはのみ ​​使用していますkPasteboardClipboardkUTTypeUTF16PlainTextコピーをサポートするために、風味を/に/クリップボードからUnicodeテキストを貼り付けます。

フィードバック

私たちは、Silverlightにクリップボードのサポートを追加し、このシンプルなA​​PIで有効になって、すべての重要なシナリオを見て興奮している。 私は特に、あなたのフィードバックを聞くことに興味を持っています:

  • SilverlightのクリップボードAPIの設計と実装上のいずれかのセキュリティ上の懸念
  • どのように重要なことは、他のデータ·タイプ/フォーマットのサポートを追加することであり、どのような優先順位で
  • それがサポートするように、APIを拡張可能にすることがいかに重要なのIDataObjectをカスタム形式/味と遅延レンダリングを可能に/データを約束した
    ありがとう!
      -Ning
      Technoratiのタグ:
      共有し、社交的に評価する!
      Tags: , , カテゴリー: Silverlightの タグ:
      1. まだコメントはありません。
      1. トラックバックはまだありません。


      6 + = 13