人様のコードにおんぶにだっこなのはまだ序の口で、あまりにも基礎知識が無さ過ぎるために、プロジェクトごと提供されているサンプルでもないとそもそも全く動かせない。
こちら「C#,WPF】コントロールやウィンドウを画像キャプチャする」を参考にさせていただいた。
「参考にさせていただいた」どころじゃなく、単に「いただいた」が正確なところ。
試しに自分で作ったプロジェクトにコードだけをクリップボード経由でテキストとして貼り付けても、エラーがいっぱいだった。
参考サイトの解説をちゃんと読んだら、
まず、プロジェクトに以下の参照設定を追加しておきます。
と書かれていて、以下の手順で確認すると、
4つ書かれているうちのSystem.Drawingが参照されていなかったのでチェックを入れた。
これでエラーは無くなったが、起動しても何も起こらなかった。
ブレークポイントを設定してトレースしたら、何も行わない。
Buttonを追加してクリック・イベントに動作を割り当てたらちゃんとキャプチャする。
つまり、イベントが設定されてない。
起動時にWindowが表示されたら1秒待ってから実行するように作られているはずだが、Windowの表示というイベントに何も仕事が設定されていないと気付いた。
下が自分で作ったプロジェクトのWindowのイベントハンドラーで、真っ白だ。
下がもらってきたプロジェクトのもので、Window_ContentRenderedという、1秒のタイマーを実行する部分が設定されている。
ContentRenderedの横の空欄をダブルクリックすると
1 2 3 |
private void Window_ContentRendered(object sender, EventArgs e) { } |
が作成されて、この中にタイマーの処理をコピペしたら予定通りの動作をするようになった。
オリジナルは、実行するとWindows内に表を描いてその下にその表のキャプチャ画像を貼る、というプログラムだ。
とりあえずは、キャプチャするエリアの指定を変えて、もとのプログラムで指定しているのとは違う場所の画像を得られるようにした。
(0, 0) – (1920, 1080) を指定すれば全画面のキャプチャが取れる。
1 2 3 4 |
// キャプチャ対象のXY座標を取得 System.Windows.Point targetPoint = new System.Windows.Point(0.0d, 0.0d); // キャプチャ領域の生成 Rect targetRect = new Rect(targetPoint.X, targetPoint.Y, 1920, 1080); |
結果はプロジェクト・フォルダの下のbinフォルダにresult.pngとして保存される。
1 2 3 4 5 6 7 |
// ビットマップをPNGで保存 using (Stream stream = new FileStream("result.png", FileMode.Create)) { PngBitmapEncoder encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(bitmap)); encoder.Save(stream); } |
古いモニタを活用してマルチモニターにしてあるのだが、その領域も含めてキャプチャできる。