# 概要

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](https://www.nuget.org/packages/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リファレンス](http://api.etoforms.picoe.ca/html/T_Eto_Drawing_Graphics.htm)を見てもそのことに違いはありませんし、かといって`Eto.Forms.Screen`から直接`Eto.Drawing.Bitmap`を取り出す手段も存在しないようです。  
Windowsだけを考えればよかった時と違い、「WinAPIを叩く」といった手段を取れないことから、スクリーンショットをどう取得すればいいのか分からず困っています。

上手くメソッドを組み合わせれば、スクリーンショットを取得することができるのでしょうか、それとも現状の仕様ではできないのでしょうか？
CC BY-SA 3.0
2018-03-13T16:55:46.420
42374
2018-03-13T16:55:46.420
12939
question
c# linux windows
Eto.Formsでスクリーンショットを取得したい