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

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

ただいまの
回答率

90.33%

  • C#

    7742questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,716

KentarouOgura

score 95

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

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はハンドルされませんでした。」というエラーとは、一体何なんなのでしょう?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

こんにちは。

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/02 16:59

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

    キャンセル

0

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

bm.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 17:47

    coco_bauer様

    まったくおっしゃるとおりでした!
    保存フォルダを、c直下ではなく、フォルダを作成してそこにしたらうまくいきました。

    ありがとうございましたm(_ _)m

    キャンセル

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

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C#

    7742questions

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