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

クリップボードのデータの取得、設定がうまくいかないときは

クリップボードに文字列をコピーする、クリップボードから文字列を取得する」や「クリップボードの画像を表示する、クリップボードに画像をコピーする」などでClipboardクラスを使ってクリップボードのデータの取得、あるいは設定する方法を紹介しています。しかしこれらを正常に行うためには、スレッドがSTA(Single Thread Apartment、シングルスレッドアパートメント)である必要があります。もしクリップボードのデータの取得、設定がうまくいかないならば、エントリポイントのMainメソッドにSTAThreadAttribute属性がマークされているか確認してみてください。STAThreadAttributeについては、こちらで説明しています。

もしアプリケーションをSTAとしたくないならば、クリップボードの処理の部分だけをSTAの別スレッドで行うということもできます。その例を以下に示します。

VB.NET
コードを隠すコードを選択
Imports System
Imports System.Windows.Forms

Module Module1
    Dim clipboardText As String = ""

    Sub GetClipboardText()
        clipboardText = Clipboard.GetText()

        '.NET Framework 1.1 以前では次のようにする
        'clipboardText = Nothing
        'Dim data As IDataObject = Clipboard.GetDataObject()
        'If data IsNot Nothing Then
        '    clipboardText = DirectCast(data.GetData(DataFormats.Text), String)
        'End If
        'If clipboardText Is Nothing Then
        '    clipboardText = ""
        'End If
    End Sub

    Sub Main()
        'STAスレッドを作成して、クリップボードのデータを取得する
        Dim t As New System.Threading.Thread(AddressOf GetClipboardText)
        t.SetApartmentState(System.Threading.ApartmentState.STA)
        '.NET Framework 1.1 以前では次のようにする
        't.ApartmentState = System.Threading.ApartmentState.STA
        t.Start()
        t.Join()

        '結果を表示する
        Console.WriteLine(clipboardText)
        Console.ReadLine()
    End Sub
End Module
C#
コードを隠すコードを選択
using System;
using System.Windows.Forms;

class ClipboardTest
{
    static string clipboardText = "";

    static void GetClipboardText()
    {
        clipboardText = Clipboard.GetText();

        //.NET Framework 1.1 以前では次のようにする
        //clipboardText = null;
        //IDataObject data = Clipboard.GetDataObject();
        //if (data != null)
        //    clipboardText = (string)data.GetData(DataFormats.Text);
        //if (clipboardText == null)
        //    clipboardText = "";
    }

    static void Main()
    {
        //STAスレッドを作成して、クリップボードのデータを取得する
        System.Threading.Thread t = new System.Threading.Thread(GetClipboardText);
        t.SetApartmentState(System.Threading.ApartmentState.STA);
        //.NET Framework 1.1 以前では次のようにする
        t.ApartmentState = System.Threading.ApartmentState.STA;
        t.Start();
        t.Join();

        //結果を表示する
        Console.WriteLine(clipboardText);
        Console.ReadLine();
    }
}

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

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。