質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

1回答

4321閲覧

クリップボードをタイマーで監視したい

cancat

総合スコア313

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/09/19 23:08

編集2017/09/20 09:50

こんにちは。
Windows10でWindowsFormのアプリケーションを開発しています。
Visual Studio 2017 Communityを使っています。

###前提・実現したいこと
クリップボードをタイマーで監視しています。

###該当のソースコード

C#

1private void clipboardwatchtimer_Tick(object sender, EventArgs e) { 2 try { 3 if (Clipboard.ContainsText()) { //←この行でエラー 4 } 5 } 6 catch(Exception exception){ 7 } 8}

###発生している問題・エラーメッセージ
このコードで、
Clipboard.ContainsText()
でエラーになります。

マネージ デバッグ アシスタント 'DisconnectedContext' が発生しました
HResult=0x00000000
Message=マネージ デバッグ アシスタント 'DisconnectedContext' : 'この RuntimeCallableWrapper の COM コンテキスト 0x7c7255c8 への変換に失敗して、エラー オブジェクトをサーバーに接続できません (HRESULT からの例外:0x800401FD (CO_E_OBJNOTCONNECTED)) が発生しました。これは、通常この RuntimeCallableWrapper が作成された COM コンテキスト 0x7c7255c8 が切断されたか、他の処理を実行していてビジーのためコンテキスト変換を処理できないことが原因です。COM コンポーネント上の要求のサービスに使用されるプロキシは存在しないため、呼び出しは COM コンポーネントに対して直接行われます。これは、破損またはデータの損失を発生させる可能性があります。この問題を回避するには、その内部に存在する COM コンポーネントを示す RuntimeCallableWrappers の使用が完了するまで、すべての COM コンテキスト、アパートメント、およびスレッドが完全に有効であり、コンテキスト変換に使用できることを確認してください。'

try-catchしているのに、catchしません。
回避する方法をご存じありませんか。

###補足情報(言語/FW/ツール等のバージョンなど)
Microsoft Visual Studio Community 2017
Version 15.0.26228.9 D15RTWSVC
Microsoft .NET Framework
Version 4.6.01586

です。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ebiryo

2017/09/20 00:02

「エラーになります」とはどういう状況を指しています? エラーの内容を正確に提示したほうがよいと思います。
cancat

2017/09/20 01:34

ハンドルされない例外が出ます。try-catchしているのに。。。
ebiryo

2017/09/20 01:42

どのような例外がthrowされているのですか?提供できる情報は提示したほうが良いと思います。
cancat

2017/09/20 01:49

そうですね。おっしゃるとおりです。次回エラーが出たときに追記します。
cancat

2017/09/20 14:01

もう書いてしまいました。消せばいいですか? 前の質問にはまったく回答なしです。気に入らないのなら、見ないでください。
cancat

2017/09/20 14:05

嫌がらせみたいに不満をいわれても、展望なくて困るんですけど。
cancat

2017/09/20 14:09

めんどうなので削除しました。
Tak1wa

2017/09/20 22:45

上記削除ポリシーを確認ください。「誤って二重に投稿してしまった」に該当する可能性がありますので、こういった場合は削除リクエストを送ることを検討してください。
guest

回答1

0

エラーの状況がわからないのでなんとも言えませんが、
下記の可能性はありませんか?
http://dobon.net/vb/dotnet/system/nostaclipboard.html

投稿2017/09/20 00:16

kikukiku

総合スコア514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cancat

2017/09/20 01:37

可能性ありますね。 Mainはstaですが、そこからFormを動かして、タイマーで別threadなのです。 そのprivate void clipboardwatchtimer_Tick(object sender, EventArgs e) {をstaにすればよいのでしょうか?
cancat

2017/09/20 14:28

Mainは、 [STAThreadAttribute] static void Main(string[] args) となっていました。
kikukiku

2017/09/21 00:38

同じ問題がスタックオーバーフローに記載がありました。 https://stackoverflow.com/questions/13550502/disconnected-context-was-detected-c-sharp-clipboard ここでも解決していないようです。 やってみて欲しいことは、Tak1waさんのコメントのように、 とりあえずinvokeしてみることをお勧めします。 本来ならばclipboardwatchtimer_TickがFormのタイマーイベントかどうかチェックしてからなのですが invokeして試してみた方が早いかなと思いました。
cancat

2017/09/21 02:47

情報ありがとうございます。 clipboardwatchtimer_TickはFormのタイマーイベントです。 invokeが必要かどうかまずチェックしてみるコードを追加して運用してみます。 というのは、動いていることも多いのです。まずはlogから。
kikukiku

2017/09/21 03:00

FormのタイマーイベントであるならばUIスレッドで動いているので、invokeの必要ないですね。このエラーはいつも発生しているわけではないのですね。そういう情報は重要かと思います。そうなると、ちょっと対応方法がわからないですね。なんとか例外をcatchして無視するようにするとかかなー。
cancat

2017/09/21 06:04

そうですね。 だいぶ前に作って、だいぶ前から時折エラーが出ていて、なにしろタイマーで自動で実行していて、try-catchしているはずなのにcatchできないとか、エラーが見たこともないとかで。 そのうえ再現性が低かったりして。 Formのタイマーのthreadとinvokeの再勉強が必要になったりして、質問するのも苦戦していますが、一歩ずつ。 「FormのタイマーイベントであるならばUIスレッドで動いているので、invokeの必要ない」の情報は感謝です。 まるっとtry-catchしているつもりなのですが。。。。
kikukiku

2017/09/21 06:28

大きな情報をクリップボードに保存している最中に、クリップボードからの取得の処理が重なったときに、発生するとか考えられないでしょうか?ま、そうだったとしてもcatchできないのであるならば対処しようがないのですが。。。。あとは、別の方法でクリップボードからの取得を検討でしょうか。調べたことはないのですが、WinAPIを直接呼ぶとかですかね。
cancat

2017/09/21 06:31

とくに大きな情報というわけではないです。ただ取得のタイミングとかかな、とは思ってます。 このソフトは自分用で、常時使っていて、たまーに(1月に1回くらいか?)頻繁にエラーが出ることがあります。ただ頻繁といっても再現性は微妙に低く。 別の方法はいまのところ考えてないです。
kikukiku

2017/09/21 06:58

今回はお力にはなれそうにないです。本来はエラーを取れなければならないので、Clipboard.ContainsTextのバグのような気がします。
cancat

2017/09/21 08:41

ありがとうございます。 やっとstackoverflow見れました。 同じですねー。 そうかー、Clipboard.ContainsTextしない、という方法もありますね。 それでcatchできるエラーを出してくれるなら、そのほうがマシかも。 とりあえずいろいろやってみます。 log取得、invoke, Clipboard.ContainsTextを削除、とか。 エラー出てもせめてMessageBoxでなければいいんですよね。ハンドルされてない例外の。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問