「クリップボードに文字列をコピーする、クリップボードから文字列を取得する」や「クリップボードの画像を表示する、クリップボードに画像をコピーする」などでClipboardクラスを使ってクリップボードのデータの取得、あるいは設定する方法を紹介しています。しかしこれらを正常に行うためには、スレッドがSTA(Single Thread Apartment、シングルスレッドアパートメント)である必要があります。もしクリップボードのデータの取得、設定がうまくいかないならば、エントリポイントのMainメソッドにSTAThreadAttribute属性がマークされているか確認してみてください。STAThreadAttributeについては、こちらで説明しています。
もしアプリケーションをSTAとしたくないならば、クリップボードの処理の部分だけをSTAの別スレッドで行うということもできます。その例を以下に示します。
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
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(); } }
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。