【VB.NET】OpenClipboard に失敗しました/要求されたクリップボード操作に成功しませんでした。

VB.NET でテキストをクリップボードへコピーしようとしたんだが、なぜかクリップボードへのコピーが失敗する。手動(Ctrl + C)でやるといともたやすく成功するのに。

簡単なメソッドなんだが。Clipboard.SetText を実行すると下記のエラー(例外)が出る。

OpenClipboard に失敗しました (HRESULT からの例外:0x800401D0 (CLIPBRD_E_CANT_OPEN)

「え~なんで~? 失敗する理由も具体的に教えてよ!」と思ってネット検索すると、

Clipboard.SetDataObject を使えばうまくいくよ

という記事があったので試す。しかし同じエラーが出る。
だめじゃ~んっ!?( ゚Д゚)クワッ

しかし、まだあきらめるのは早い。更に調べると My.Computer.Clipboard.SetText というメソッドがあることが分かったので期待を抱きつつ試した。が、下記のように無慈悲なエラーが出た。

要求されたクリップボード操作に成功しませんでした。

ヽ(`Д´#)ノ ムキー!!

落ち着け、俺。君なら、できる。

暴れ馬になりそうな心を懸命になだめながら試行を重ねる。そしてついに辿り着く。なにげに Clipboard.Clear を最初に実行してから試してみると・・・

エラーが出ないじゃんっ!!
v( ̄Д ̄)v イエ~イ

更に検証を重ねて、Clipboard.Clear を最初に実行すればだいたい問題なくクリップボードにコピーできることは分かった。ただし、エラーが出た直後だと、Clipboard.Clear を実行しても Clipboard.SetText はエラーが起きる確率が高いことが分かった。Clipboard.SetDataObject もよく分からないタイミングでエラーが出ることがあるみたいだ。

結論を言うと、Clipboard.Clear を実行した後の安定感は

  1. My.Computer.Clipboard.SetText
  2. Clipboard.SetDataObject
  3. Clipboard.SetText

の順かな?

念のため、Try ~ Catch を入れておくことにしよう。

Try
    Clipboard.Clear
    System.Threading.Thread.Sleep(100) '2018-10-22 追記。理由は後述のMEMO参照。
    My.Computer.Clipboard.SetText(Me.body.Text)
    'Clipboard.SetDataObject(Me.body.Text, True)
    'Clipboard.SetText(Me.body.Text, TextDataFormat.Text)
    MsgBox("クリップボードにコピーしました。", MsgBoxStyle.Information, Application_ProductName)
Catch ex As Exception
    MsgBox("クリップボードへのコピーに失敗しました。再試行するか、対象テキストを選択して Ctrl+C を押してコピーしてください。", MsgBoxStyle.Exclamation, Application_ProductName)
End Try

 

権限か何かの関係でエラーが出るのかなぁ? タイミングの問題か? ちなみに Windows 10 Home Edition (64bit) なんですが。

MEMO

クリップボードへのコピーでエラー(例外)が出ても、(直後に手動でペーストを試してみると)実際はちゃんとコピーされているようだった。あのエラーはなんだったのだろう?

MEMO

日を改めて試したら、Clipboard.Clear を実行しなくても上記に挙げた 3 メソッド全てが何も問題なく実行できた(それぞれ 100 回ループ実行したけど問題なし)。何らかの条件下でエラーが出るってことか・・・で、それはそれでこっちに置いといて。

 

ネット検索してたら、私と同じように Clipboard.Clear を最初に実行することを勧めている英語記事を見つけた。また、Clipboard.Clear の直後に 100 ミリ秒ほど間を置くとエラーが出なくなったという話も聞いたので、上記のようにコードを修正しておいた。今のところこれでエラーが出たことはない。

 

購読する
通知を受け取る対象
guest
0 Comments
Inline Feedbacks
View all comments