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 を実行した後の安定感は
- My.Computer.Clipboard.SetText
- Clipboard.SetDataObject
- 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) なんですが。
クリップボードへのコピーでエラー(例外)が出ても、(直後に手動でペーストを試してみると)実際はちゃんとコピーされているようだった。あのエラーはなんだったのだろう?
日を改めて試したら、Clipboard.Clear を実行しなくても上記に挙げた 3 メソッド全てが何も問題なく実行できた(それぞれ 100 回ループ実行したけど問題なし)。何らかの条件下でエラーが出るってことか・・・で、それはそれでこっちに置いといて。
ネット検索してたら、私と同じように Clipboard.Clear を最初に実行することを勧めている英語記事を見つけた。また、Clipboard.Clear の直後に 100 ミリ秒ほど間を置くとエラーが出なくなったという話も聞いたので、上記のようにコードを修正しておいた。今のところこれでエラーが出たことはない。
突然、同じ例外がでましたが記事みて直ったようです!
ありがとうございました。