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

SilverlightのクリップボードAPI

SilverlightでクリップボードAPI

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

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

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

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

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

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

    Clipboard Prompt
    ユーザーが[はい]をクリックすると、Silverlightはこれを許可し、後でGetTextは/ SetTextによっては、このセッション中に、このアプリケーションのために成功するために呼び出します。 ユーザがNo、デフォルトをクリックすると、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のクリップボードAPIは、経由して、より拡張可能なデータ形式をサポートしているのIDataObject 、テキスト、イメージ、オーディオなどの一般的なフォーマットのためのヘルパー関数を持っていfiledrop

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

パブリック静的ブール ContainsAudio();
format); パブリック静的ブール ContainsData( 文字列形式 );
パブリック静的ブール ContainsFileDropList();
パブリック静的ブール ContainsImage();
パブリック静的ブール ContainsText();
パブリック静的ブール ContainsText(TextDataFormat形式)。
パブリック静的ストリームGetAudioStream();
format); パブリック静的オブジェクトのGetData( 文字列形式 );
[SecurityCritical]
パブリック静的のIDataObject GetDataObject();
パブリック静的 StringCollection GetFileDropList();
パブリック静的た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. アプリケーションは、実際の味データや各フレーバー(と約束いずれかを含む、ペーストボードに各項目の1つ以上のフレーバーを追加します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. トラックバックはまだありません。


      + 8 = 14