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

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

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

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

Q&A

解決済

2回答

5616閲覧

C# スクリーンショットをとることが出来ない。

KentarouOgura

総合スコア105

C#

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

0グッド

0クリップ

投稿2015/10/02 07:41

たびたび申し訳ございません。

C#からブラウザを起動し、スクリーンショットを取得するために、
ネットで見つけたサンプルプログラムをコピペして試してみたのですが、
うまくいきません。

2種類試してみたのですが、どちらも保存のところで、
「External Exceptionはハンドルされませんでした。」というエラーになってしまう。

--

(1)画面をキャプチャする
http://dobon.net/vb/dotnet/graphics/screencapture.html

(2)スクリーンやウィンドウをキャプチャするには?[2.0のみ、C#、VB]
http://www.atmarkit.co.jp/fdotnet/dotnettips/428screencapture/screencapture.html

--

(1)画面をキャプチャする
http://dobon.net/vb/dotnet/graphics/screencapture.html

private void button4_Click(object sender, EventArgs e) { // 画像のサイズを指定し、Bitmapオブジェクトのインスタンスを作成 Bitmap bm = new Bitmap(500, 300); // 幅500ピクセル × 高さ300ピクセルの場合 // Graphicsオブジェクトのインスタンスを作成 Graphics gr = Graphics.FromImage(bm); // 画面全体をコピー gr.CopyFromScreen(new Point(0, 0), new Point(0, 0), bm.Size); // PNGで保存 bm.Save("C:\\samplePNG.png", System.Drawing.Imaging.ImageFormat.Png); ←ここで「External Exceptionはハンドルされませんでした。」というエラーになってしまう。 gr.Dispose(); }

(2)スクリーンやウィンドウをキャプチャするには?[2.0のみ、C#、VB]
http://www.atmarkit.co.jp/fdotnet/dotnettips/428screencapture/screencapture.html

private void button4_Click(object sender, EventArgs e) { // スクリーン・キャプチャする範囲を決定 Rectangle rc; rc = Screen.PrimaryScreen.Bounds; // Bitmapオブジェクトにスクリーン・キャプチャ Bitmap bmp = new Bitmap( rc.Width, rc.Height, PixelFormat.Format32bppArgb); using (Graphics g = Graphics.FromImage(bmp)) { g.CopyFromScreen(rc.X, rc.Y, 0, 0, rc.Size, CopyPixelOperation.SourceCopy); // ビット・ブロック転送方式の切り替え例: //g.FillRectangle(Brushes.LightPink, // 0, 0, rc.Width, rc.Height); //g.CopyFromScreen(rc.X, rc.Y, 0, 0, // rc.Size, CopyPixelOperation.SourceAnd); } // ビットマップ画像として保存して表示 string filePath = @"C:\screen.bmp"; bmp.Save(filePath, ImageFormat.Bmp);←ここで「External Exceptionはハンドルされませんでした。」というエラーになってしまう。 Process.Start(filePath); }

なぜ、保存がエラーになってしまうのかがわかりません。
また、「External Exceptionはハンドルされませんでした。」というエラーとは、一体何なんなのでしょう?

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

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

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

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

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

guest

回答2

0

一般のユーザは、C:\ フォルダの変更権限がありませんから、C:\の下にファイルを作ったり、削除したりすることが出来ません。

C#

1bm.Save("C:\samplePNG.png")

が失敗するのは、そのせいではないかと思われます。

KentarouOguraさんが書き込みの出来るフォルダに書き込むようにするとうまくいくのではないでしょうか(例えば、"C:\samplePNG.png"を"C:\Users\KentarouOgura\Documents\samplePNG.png"に変える)。
あるいは、Tak1waさんがおっしゃるようにAdministratorとして実行するかです。


「External Exceptionはハンドルされませんでした。」というのは、
・bm.Saveを実行中にエラーが発生したため、Exception(例外)が発生した。
・ところが、プログラムには例外処理(try-catch構文で定義します)が書かれていなかったので、「例外(External Exception)が発生しましたが、それの処理が定義されていないので、例外の処理(Exception handling(ハンドルする))ができませんでした」というメッセージ出されたのです。

例外処理をするようにプログラムを書いて、例外の詳細を画面に表示すると、何が原因で例外が起きたのかを知ることができます。
例外処理を書くのは少し面倒ですが、ちゃんと書いておいた方が、トラブルが起きた時の対処が楽ですよ。
特に、たまにしか起きない例外の原因を探るには必須です。

投稿2015/10/02 08:40

coco_bauer

総合スコア6915

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

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

KentarouOgura

2015/10/02 08:47

coco_bauer様 まったくおっしゃるとおりでした! 保存フォルダを、c直下ではなく、フォルダを作成してそこにしたらうまくいきました。 ありがとうございましたm(_ _)m
guest

0

ベストアンサー

こんにちは。

ファイル保存失敗でまず疑うべきは、権限です。
ビルドしたモジュールを管理者として実行して試してみてください。

それでうまくいくのであればファイルの保存先を工夫するとか。
どうしても保存場所を変えれないのであれば管理者権限を必須にするとか。
でしょうか。

投稿2015/10/02 07:52

Tak1wa

総合スコア4791

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

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

KentarouOgura

2015/10/02 07:59

おおお!!! 保存先をc直下でないようにしたら、保存出来ました!!! ありがとうございました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問