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

SilverlightのクリップボードAPI

SilverlightでのクリップボードAPI

Silverlight 4は、クリップボードのサポートが追加されました。 Scott Guthrie氏とBrian Goldfarb本人だから驚くべきデモ今日でチェックアウトPDCショーケースのシナリオはSilveilght4クリップボードのサポートで有効になっていることを。

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

  公共の静的なクラスをクリップボード 
{
のpublic static boolを 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はBooleanです。

clipboadDataオブジェクトが初めてアクセスされたとき、IEは、スクリプトがクリップボードへのアクセスを許可するユーザーにプロンプ​​トが表示されますと、設定がセッションのみ有効です。

WPFのクリップボードAPIを通じ、より拡張可能なデータ形式をサポートし、IDataObjectを 、テキスト、イメージ、音声、などの一般的なフォーマットのためのヘルパー関数がありますfiledropを

 公共の静的なクラスをクリップボード 
{
[SecurityCritical]
クリアします。public static void();

のpublic static boolを ContainsAudio();
format); のpublic static boolを ContainsData( 文字列形式)。
のpublic static boolを ContainsFileDropList();
のpublic static boolを ContainsImage();
のpublic static boolを ContainsText();
のpublic static boolを ContainsText(たTextDataFormat形式);
公共の静的なストリームGetAudioStream();
format); 公共の静的なオブジェクトのGetData( 文字列形式)。
[SecurityCritical]
パブリック静的 IDataObjectをGetDataObject();
パブリック静的 StringCollection内のGetFileDropList();
公共の静的な BitmapSourceをGetImageは();
パブリック静的な文字列のgettext();
パブリック静的な文字列は、gettext(たTextDataFormat形式);

のpublic static boolを IsCurrent(IDataObjectのデータ);

[] audioBytes); します。public static void SetAudio( バイト [] audioBytes);
します。public static void SetAudio(ストリームaudioStream);
format, object data); します。public static void SetDataメソッド( 文字列形式オブジェクトのデータ);
[SecurityCritical]
data); します。public static void SetDataObject( オブジェクトデータ);
[SecurityCritical]
data, bool copy); します。public static void SetDataObject( オブジェクトデータは、boolコピー);
パブリック静的ボイド SetFileDropList(StringCollectionをのfileDropList);
します。public static void SetImage(BitmapSourceの画像);
text); パブリック静的ボイドます。setText( 文字列のテキスト);
text, TextDataFormat format); します。public static voidます。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が使用するペーストマネージャを それはで文書化されていますマックDev Centerの 以下の抜粋は、(APIの付加価値を含む)の概要を説明します。

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

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

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

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

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

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

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

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

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

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

  3. それがサポートされているフレーバーのペーストボード上のアプリケーション要求は、アイテム(またはアイテム)

  4. 貼り付けたデータはファイルとして格納する場合は、受信側アプリケーションは、どのフレーバーデータを要求する前に、貼り付け位置を設定する必要があります。 他のケースでは、受信側アプリケーションは、ペーストデータが約束されたかどうかを心配する必要はありません。

コピーアプリケーションの約束キーパーが呼び出された場合、コールバックは以下を行う必要があります。

  • データはファイルとして格納する場合は、受信アプリケーションによって指定された貼り付け位置を決定します。

  • 生成するか、またはそうでなければ転送のための約束のデータを準備します。

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

しばらくして、アプリケーションが終了するとき、またはそれがもはやペーストを必要としない場合、アプリケーションは、ペーストボードの参照を解放することができます。

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

フィードバック

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

  • SilverlightのクリップボードAPIの設計と実装上のすべてのセキュリティ上の懸念
  • それは他のデータ·タイプ/フォーマットのサポートを追加することがいかに重要であるか、どのような優先順位で
  • それはサポートしているように、APIを拡張しやすくすることがいかに重要であるか、IDataObjectをカスタム形式/風味と遅延レンダリング/約束のデータを可能にする、
    ありがとう!
      Technoratiのタグ:
      Tags: , , カテゴリー: Silverlightの タグ:
      1. dileep
        22:08 2011年10月2日| #1

        OOBのモードでは、我々はKeyboard.PleaseのPrint Screenボタンは、私に知らせて押しての結果だったクリップボードの画像をアクセスすることができます。

        -dileep

      2. 18:00 2011年3月10日| #2

        Excelデータを貼り付けることができるようにたいと思います。 現在それが働かせる方法はExcelで表示されていない任意の番号を取り除きます。 例:$ 19.95 Excelで表示されますが、基になるセルの値が実際に19.949999999 Excelの基になるデータの精度を損なうことなく素敵なディスプレイを提供していますが、それはSilverlightでのコピー&ペーストですべて失われていない...私のユーザーは約あまりにも幸せではありませんした。 Excelの書式または我々が必要なときに私は私たちがそのシナリオを扱うことができる少なくともExcelのXMLデータフォーマットでそのデータを取得できるようにするとよいでしょう。

      3. ニックグレー
        18:50 2010年9月27日| #3

        私たちのビジネスアプリが貼り付け画像のサポートを必要としています、提供してください

      4. 11時08分12月19日、2009 | #4

        @ミゲル
        フィードバックのおかげで、注意!

      5. 11:08 2009年12月19日| #5

        @アンジェイRusztowicz
        フィードバックのおかげで、注意!

      6. 16:53 2009年11月29日| 第6位

        イメージのサポートのために1

      7. 夜12時56分に2009年11月26日| #7

        クリップボードのテキストのサポートは、Silverlightの "持っている必要があります"ですが、クリップボード_image_のサポートは、Silverlightの "キラー機能"とし、開発者は、空気、FlashやJavaScriptでそれを選択することができます。

        スクリーンショット、顔文字の単純なコピー/貼り付け、写真はFlickr、MySpace、およびフォーラムのような多くのウェブサイトに革命をもたらすだろう。 機能シングル "アップロード複数のファイル"に目に見えないフラッシュを使用するのと同様、この単一の機能のためにそれを使用する場合にのみ、開発者はSilverlightの普及を促進するであろう。

        ウェブカメラのサポートがSL 4で追加されているので、これは次の明白なステップである(ユーザーが "コピー/貼り付け"スクリーンショットをするには、画面でカメラを指すことができますが、このユーザーフレンドリーですか?)

      1. 01:23 2009年11月26日| #1
      2. 08:38 2009年12月30日| #2