Eto.Formsでスクリーンショットを取得したい
概要
C#で、画面のスクリーンショットを使用するツールを制作しようと考えています。
ここで言う「スクリーンショット」とは、ディスプレイ全体のスクショに限らず、例えば「左上座標(100,100)から640x480の大きさ」といった指定ができるものを指します。
元々はWPFで開発しており、その際は次のようなコードを書いていました。
// 切り取る左上座標を(left, top)、切り取る大きさを(width,height)とする
var image = new System.Drawing.Bitmap(
width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
using (var g = System.Drawing.Graphics.FromImage(image)) {
g.CopyFromScreen(left, top, 0, 0, image.Size);
}
ここで、Windows以外でも動くように出来ないかと考えた私は、Eto.FormsをNugetで落として使おうと判断しました。Eto.FormsにもBitmapクラスやGraphicsクラスがあったので、簡単に移植できると考え次のようなコードを書きました。
// 切り取る左上座標を(left, top)、切り取る大きさを(width,height)とする
var image = new Eto.Drawing.Bitmap(
width, height, Eto.Drawing.PixelFormat.Format24bppRgb);
using (var g = Eto.Drawing.Graphics(image)) {
g.CopyFromScreen(left, top, 0, 0, image.Size); //問題の箇所
}
ところが、Eto.Drawing.Graphics
にはCopyFromScreen
メソッドが存在しないということがここで判明しました。APIリファレンスを見てもそのことに違いはありませんし、かといってEto.Forms.Screen
から直接Eto.Drawing.Bitmap
を取り出す手段も存在しないようです。
Windowsだけを考えればよかった時と違い、「WinAPIを叩く」といった手段を取れないことから、スクリーンショットをどう取得すればいいのか分からず困っています。
上手くメソッドを組み合わせれば、スクリーンショットを取得することができるのでしょうか、それとも現状の仕様ではできないのでしょうか?