質問者
スクリーンキャプチャにて”ハンドルが無効”エラー

質問
-
お世話になっております。
表題の通り、スクリーンキャプチャでエラーが発生します。
機能:
1s毎にスクリーンキャプチャを行うコード:
private Bitmap getScreenCatpure(Point StartPoint, Point EndPoint) { int abX, abY; abX = Math.Abs(EndPoint.X - StartPoint.X); abY = Math.Abs(EndPoint.Y - StartPoint.Y); Size sz = new Size(abX, abY); Bitmap screenImage = new Bitmap(abX, abY); using (Graphics g = Graphics.FromImage(screenImage)) { g.CopyFromScreen(StartPoint, new Point(0, 0), sz);// エラー発生 } return screenImage; }
エラー内容:
識者の方、どうかご教示ください。補足:
ちなみにこのエラーは実行時に出るものではありません、時間が立つと起こります。
また、使用メモリは600Mを超えておりメモリの開放が出来ていいないとかでしょうか?補足:
すみません、展開コード以外のメソッドでメモリが開放できていなかった箇所がありました。
↑ メモリ解放後は使用メモリが肥大することはなくなりましたが、やはり同エラーで止まります。
対策後、挙動を確認したいと思います。- 編集済み コーベル 2017年11月8日 2:17 追記
すべての返信
-
uemu さん、ご回答ありがとうございます。
再現テストまでして頂いて申し訳ないです。
私も同メソッドを回してみましたが再現せず、どこで起きているのか
分かっていない状況です。本アプリは、市販品のアプリのデータを利用し拡張したいとの要望で作成したもので
(市販品アプリの為、データの吸出しがオンメモリでしかできず、それは困るとのこと)
市販アプリの画像解析によりデータを抽出しています。動作確認を行うも、必ず再現するものの、再現するタイミングが違い時間がかかり
さらにエラーが発生するのが同メソッド内なので探せずにいます、、
取り急ぎ、キャプチャ画面をロギングし、内容を確認していきます。 -
Graphics.CopyFromScreen はデスクトップの HDC 取得である GetDC(NULL) と、Graphics クラス自身の HDC、それらを用いた BitBlt という実装になっています。
この例外が表出しうるのは、BitBlt に渡されたこの 2 つの HDC の一方、または両方が無効であると判定された場合のみです。GDI オブジェクトがリークしていて限界を迎えたケースは想像しやすいですが、その他の問題の可能性は正直、難しいと思います。
ひとまず、ある程度の時間、稼働させて、GDI オブジェクトの数など、何らかのメモリ・リソースの指標が単調増加していないかを観測するところからでしょう。おそらくは、そのプログラム固有の不具合、次にある可能性は Windows の不具合なので、第三者が解決につながるコメントを寄せるのは難しいと思われます。
- 編集済み AzuleanMVP, Moderator 2017年11月8日 14:03
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年11月9日 0:19
-
コーベル さん、こんにちは
フォーラム オペレーターの立花楓です。本件について、問題の原因は確認できましたでしょうか。
既に問題が解決されているのでしたら幸いですが、なにか進展がございましたらこちらのスレッドへご返信いただけますと幸いです。また、参考になる情報がありましたら、投稿者からの [回答としてマーク] をお願いします。
宜しくお願いします。MSDN/TechNet Community Support 立花楓