DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

クリップボードのデータの形式を取得する

クリップボード内のデータに関連付けられているすべての形式(フォーマット)を取得するには、IDataObject.GetFormatsメソッドを使います。GetFormatsメソッドは、データがサポートしている形式のリストを文字列の配列として返します。

クリップボードに格納されたデータに関連付けられているすべての形式を列挙する例を以下に示します。

VB.NET
コードを隠すコードを選択
'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
C#
コードを隠すコードを選択
//using System.Windows.Forms;

//クリップボードのデータを取得する
//クリップボードにデータが無いときはnullを返す
IDataObject data = Clipboard.GetDataObject();

if (data != null)
{
    //関連付けられているすべての形式を列挙する
    foreach (string fmt in data.GetFormats())
    {
        Console.WriteLine(fmt);
    }
}

ある形式のデータがクリップボードにあるか調べる

ある形式に関連付けられたデータがクリップボードにあるかを調べるならば、IDataObject.GetDataPresentメソッドを使います。

以下に"Text"形式のデータがあるか調べる例を示します。

VB.NET
コードを隠すコードを選択
'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
C#
コードを隠すコードを選択
//using System.Windows.Forms;

//クリップボードのデータを取得する
//クリップボードにデータが無いときはnullを返す
IDataObject data = Clipboard.GetDataObject();
if (data != null)
{
    //DataFormats.Textに関連付けられたデータがあるか調べる
    if (data.GetDataPresent(DataFormats.Text))
    {
        Console.WriteLine("Text に関連付けられたデータがあります");
    }
}

また、GetDataPresentメソッドを使って、指定した型で取得できるかを調べることもできます。下の例では、String型で取得できるか調べています。

VB.NET
コードを隠すコードを選択
Dim data As IDataObject = Clipboard.GetDataObject()
If data IsNot Nothing Then
    If data.GetDataPresent(GetType(String)) Then
        Console.WriteLine("String型に変換できるデータがあります")
    End If
End If
C#
コードを隠すコードを選択
IDataObject data = Clipboard.GetDataObject();
if (data != null)
{
    if (data.GetDataPresent(typeof(string)))
    {
        Console.WriteLine("String型に変換できるデータがあります");
    }
}

autoConvertパラメータについて

ここで紹介したIDataObject.GetFormatsやGetDataPresentメソッドには、2番目のパラメータとして、ブール型のautoConvertパラメータを指定することもできます。autoConvertパラメータはこれらのメソッド以外でも、「クリップボードに文字列をコピーする、クリップボードから文字列を取得する」や「クリップボードの画像を表示する、クリップボードに画像をコピーする」で紹介しているIDataObject.GetDataやSetDataメソッドでも指定できます。

autoConvertパラメータをfalseにしたときは、指定したDataFormatsのデータがクリップボードに見つからなければ、見つからなかったものとなります。しかしtrueにすれば、指定したDataFormatsのデータがクリップボードに見つからなくても、その形式に変換できるデータがあれば、見つかったことになります。

autoConvertパラメータは省略すると、trueになります。

例えば、GetFormatsメソッドのautoConvertパラメータをtrueまたはfalseにした時の違いを調べるために以下のようなコードを書き、これをWindows XPのメモ帳で文字列をコピーした後で実行したとします。

VB.NET
コードを隠すコードを選択
'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
C#
コードを隠すコードを選択
//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ならば取得できません。

VB.NET
コードを隠すコードを選択
'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
C#
コードを隠すコードを選択
//using System.Windows.Forms;

IDataObject data = Clipboard.GetDataObject();
if (data != null)
{
    //メモ帳でコピーした文字列も取得できる
    Console.WriteLine(data.GetData(DataFormats.StringFormat));
    //メモ帳でコピーした文字列は取得できない
    Console.WriteLine(data.GetData(DataFormats.StringFormat, false));
}

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。