クリップボード内のデータに関連付けられているすべての形式(フォーマット)を取得するには、IDataObject.GetFormatsメソッドを使います。GetFormatsメソッドは、データがサポートしている形式のリストを文字列の配列として返します。
クリップボードに格納されたデータに関連付けられているすべての形式を列挙する例を以下に示します。
'Imports System.Windows.Forms 'クリップボードのデータを取得する 'クリップボードにデータが無いときはNothingを返す Dim data As IDataObject = Clipboard.GetDataObject() If Not data Is Nothing Then '関連付けられているすべての形式を列挙する For Each fmt As String In data.GetFormats() Console.WriteLine(fmt) Next End If
//using System.Windows.Forms; //クリップボードのデータを取得する //クリップボードにデータが無いときはnullを返す IDataObject data = Clipboard.GetDataObject(); if (data != null) { //関連付けられているすべての形式を列挙する foreach (string fmt in data.GetFormats()) { Console.WriteLine(fmt); } }
ある形式に関連付けられたデータがクリップボードにあるかを調べるならば、IDataObject.GetDataPresentメソッドを使います。
以下に"Text"形式のデータがあるか調べる例を示します。
'Imports System.Windows.Forms 'クリップボードのデータを取得する 'クリップボードにデータが無いときはNothingを返す Dim data As IDataObject = Clipboard.GetDataObject() If Not data Is Nothing Then 'DataFormats.Textに関連付けられたデータがあるか調べる If data.GetDataPresent(DataFormats.Text) Then Console.WriteLine("Text に関連付けられたデータがあります") End If End If
//using System.Windows.Forms; //クリップボードのデータを取得する //クリップボードにデータが無いときはnullを返す IDataObject data = Clipboard.GetDataObject(); if (data != null) { //DataFormats.Textに関連付けられたデータがあるか調べる if (data.GetDataPresent(DataFormats.Text)) { Console.WriteLine("Text に関連付けられたデータがあります"); } }
また、GetDataPresentメソッドを使って、指定した型で取得できるかを調べることもできます。下の例では、String型で取得できるか調べています。
Dim data As IDataObject = Clipboard.GetDataObject() If data IsNot Nothing Then If data.GetDataPresent(GetType(String)) Then Console.WriteLine("String型に変換できるデータがあります") End If End If
IDataObject data = Clipboard.GetDataObject(); if (data != null) { if (data.GetDataPresent(typeof(string))) { Console.WriteLine("String型に変換できるデータがあります"); } }
ここで紹介したIDataObject.GetFormatsやGetDataPresentメソッドには、2番目のパラメータとして、ブール型のautoConvertパラメータを指定することもできます。autoConvertパラメータはこれらのメソッド以外でも、「クリップボードに文字列をコピーする、クリップボードから文字列を取得する」や「クリップボードの画像を表示する、クリップボードに画像をコピーする」で紹介しているIDataObject.GetDataやSetDataメソッドでも指定できます。
autoConvertパラメータをfalseにしたときは、指定したDataFormatsのデータがクリップボードに見つからなければ、見つからなかったものとなります。しかしtrueにすれば、指定したDataFormatsのデータがクリップボードに見つからなくても、その形式に変換できるデータがあれば、見つかったことになります。
autoConvertパラメータは省略すると、trueになります。
例えば、GetFormatsメソッドのautoConvertパラメータをtrueまたはfalseにした時の違いを調べるために以下のようなコードを書き、これをWindows XPのメモ帳で文字列をコピーした後で実行したとします。
'Imports System.Windows.Forms 'クリップボードのデータを取得する 'クリップボードにデータが無いときはnullを返す Dim data As IDataObject = Clipboard.GetDataObject() If Not data Is Nothing Then '関連付けられているすべての形式を列挙する 'autoConvertがTrueの時 Console.WriteLine(">>> autoConvert = true") For Each fmt As String In data.GetFormats() Console.WriteLine(fmt) Next 'autoConvertがFalseの時 Console.WriteLine(">>> autoConvert = false") For Each fmt As String In data.GetFormats(False) Console.WriteLine(fmt) Next End If
//using System.Windows.Forms; //クリップボードのデータを取得する //クリップボードにデータが無いときはnullを返す IDataObject data = Clipboard.GetDataObject(); if (data != null) { //関連付けられているすべての形式を列挙する //autoConvertがtrueの時 Console.WriteLine(">>> autoConvert = true"); foreach (string fmt in data.GetFormats()) { Console.WriteLine(fmt); } //autoConvertがfalseの時 Console.WriteLine(">>> autoConvert = false"); foreach (string fmt in data.GetFormats(false)) { Console.WriteLine(fmt); } }
結果は、次のようになります。
>>> autoConvert = true System.String UnicodeText Text Locale OEMText >>> autoConvert = false UnicodeText Locale Text OEMText
つまり両者の違いは、"System.String"(DataFormats.StringFormat)があるかないかです。"System.String"は.NET Frameworkで使用される形式ですので、通常のアプリケーションで対応していないのは当然です。しかしテキストデータを"System.String"に変換することはできるため、autoConvertをtrueにしたときは"System.String"がリストに表示されます。
同じように、このデータをIDataObject.GetDataメソッドで取得するときに"System.String"形式を指定すると、autoConvertがtrueであれば取得できますが、falseならば取得できません。
'Imports System.Windows.Forms Dim data As IDataObject = Clipboard.GetDataObject() If Not data Is Nothing Then 'メモ帳でコピーした文字列も取得できる Console.WriteLine(data.GetData(DataFormats.StringFormat)) 'メモ帳でコピーした文字列は取得できない Console.WriteLine(data.GetData(DataFormats.StringFormat, False)) End If
//using System.Windows.Forms; IDataObject data = Clipboard.GetDataObject(); if (data != null) { //メモ帳でコピーした文字列も取得できる Console.WriteLine(data.GetData(DataFormats.StringFormat)); //メモ帳でコピーした文字列は取得できない Console.WriteLine(data.GetData(DataFormats.StringFormat, false)); }