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は成功したように、次のいずれかが必要です。
- 呼び出し元のSilverlightアプリケーションが上昇信頼するアプリケーション、または
- それが開始したユーザーおよびユーザー補助クリップボードへのアクセスです。
後者の場合は、gettextあるいはます。setTextが最初にイベント処理を開始したユーザーに呼び出されたときに、Silverlightは、以下の1(UIはRTWで変更される可能性があります)のようなダイアログがポップアップ表示されます。

- ユーザーが[はい]をクリックすると、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つ(作成PasteboardCreateを )。
次に、アプリケーションは、ペーストボードの所有権を取得し、現在の内容を(クリアPasteboardClear )。
アプリケーションが選択されたデータにアイテムIDを割り当てます。
すべてのデータが約束される場合は、アプリケーションが約束したデータ(供給する約束キーパーのコールバック関数を登録する必要がありますPasteboardSetPromiseKeeperを )。
アプリケーションは、実際のフレーバーデータや各フレーバーとの約束(いずれかを含む、ペーストボードにそれぞれのアイテムの1つ以上のフレーバーを追加しますPasteboardPutItemFlavor )。
受信側アプリケーションでは、貼り付けアクションを処理するタスクのわずかに異なるセットを備えています。
アプリケーションがアクティブになるときは、ペーストボードは、(変更されているかどうかを確認しPasteboardSynchronize )。 もしそうであれば、ペーストボード上のフレーバーのリストを取得します。 アプリケーションがサポートする任意のフレーバーがある場合、その貼り付け]メニュー項目を有効にすることができます。
ユーザーは、[貼り付け]メニュー項目を起動します。
それがサポートされているフレーバーのペーストボード上のアプリケーション要求は、アイテム(またはアイテム)
貼り付けたデータはファイルとして格納する場合は、受信側アプリケーションは、どのフレーバーデータを要求する前に、貼り付け位置を設定する必要があります。 他のケースでは、受信側アプリケーションは、ペーストデータが約束されたかどうかを心配する必要はありません。
コピーアプリケーションの約束キーパーが呼び出された場合、コールバックは以下を行う必要があります。
データはファイルとして格納する場合は、受信アプリケーションによって指定された貼り付け位置を決定します。
生成するか、またはそうでなければ転送のための約束のデータを準備します。
約束したデータがファイルとして格納されていない場合は、ペーストボードに風味とデータを追加します。 それ以外の場合は、指定されたファイルの場所に約束したデータを転送します。
しばらくして、アプリケーションが終了するとき、またはそれがもはやペーストを必要としない場合、アプリケーションは、ペーストボードの参照を解放することができます。
Windows上のように、SilverlightのクリップボードAPIのみを使用kPasteboardClipboardとkUTTypeUTF16PlainTextコピーをサポートして/へ/クリップボードからUnicodeテキストを貼り付けるの味を。
フィードバック
我々は、Silverlightにクリップボードのサポートを追加し、このシンプルなAPIによってイネーブルにされたすべての重要なシナリオを見て興奮しています。 私は特に、あなたのフィードバックを聞くことに興味を持っています:
- SilverlightのクリップボードAPIの設計と実装上のすべてのセキュリティ上の懸念
- それは他のデータ·タイプ/フォーマットのサポートを追加することがいかに重要であるか、どのような優先順位で
- それはサポートしているように、APIを拡張しやすくすることがいかに重要であるか、IDataObjectをカスタム形式/風味と遅延レンダリング/約束のデータを可能にする、
- ありがとう!
- 寧








最近のコメント