BackgroundWorkerを使ってクリップボードをクリアするとエラーが起きる への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 YuO  (社会人)
投稿日時
2011/3/15 22:21:48
System.Windows.Forms以下のクラスは,原則として「メインスレッドからのみ使用可能」です。
元はCOMのスレッドモデルからくる制約なのですが,
その都合上System.Windows.Forms.Clipboardもメインスレッドからのみ使用可能となります。
細かい話は「COM アパートメントモデル」あたりで検索すると出てくると思いますが……。
なので,メインスレッド側で実行できるようにするか,
EmptyClipboard APIを使ってCOMの問題を回避する,
というのが例外の回避方法になると思います。
MSDN: EmptyClipboard Function (Windows)
http://msdn.microsoft.com/en-us/library/ms649037.aspx
元はCOMのスレッドモデルからくる制約なのですが,
その都合上System.Windows.Forms.Clipboardもメインスレッドからのみ使用可能となります。
細かい話は「COM アパートメントモデル」あたりで検索すると出てくると思いますが……。
なので,メインスレッド側で実行できるようにするか,
EmptyClipboard APIを使ってCOMの問題を回避する,
というのが例外の回避方法になると思います。
MSDN: EmptyClipboard Function (Windows)
http://msdn.microsoft.com/en-us/library/ms649037.aspx
投稿者 ジャスタウェイ  (社会人)
投稿日時
2011/3/15 21:38:01
DoWorkイベントにクリップボードをクリアする
Clipboard.Clear()
が実行されるときにエラーが出ます。
エラーは以下の通りです。
OLE が呼び出される前に、現在のスレッドが Single Thread Apartment (STA) モードに設定されていなければなりません。Main 関数に STAThreadAttribute が設定されていることを確認してください。
原因がわかりません。
Clipboard.Clear()
が実行されるときにエラーが出ます。
エラーは以下の通りです。
OLE が呼び出される前に、現在のスレッドが Single Thread Apartment (STA) モードに設定されていなければなりません。Main 関数に STAThreadAttribute が設定されていることを確認してください。
原因がわかりません。
bw.WorkerReportsProgress = True
Private Sub bw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bw.DoWork
bw.ReportProgress(50) '<--- 50は適当な整数
End Sub
Private Sub bw_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bw.ProgressChanged
Clipboard.Clear() '<--- e.ProgressPercentageで処理を分岐してもよいかも
End Sub
のようにメインスレッドに処理を戻せば可能です。