2016-11-08 5 views
0

私はこのメソッドをPrint()と呼びます。私はそれを呼び出すと、プライマリ画面のすべてのピクセルからビットマップを作成します。PrimaryScreenをAllScreensに正しく変更するにはどうすればよいですか?

ただし、プライマリ画面でのみ表示されます(はい、私はScreen.PrimaryScreenで、Screen.AllScreensではありません)。

私はそれを試みましたが、私はすべての画面の配列を作成しなければなりませんでした。私はこの方法と全く同じことを、複数の画面ではどうすれば達成できますか?

private void Print() 
{ 
    string path; 
    path = "%AppData%\\Image.png"; 
    path = Environment.ExpandEnvironmentVariables(path); 

    Bitmap bt; 
    Graphics screenShot; 

    bt = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb); 
    screenShot = Graphics.FromImage(bt); 
    screenShot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy); 
    bt.Save(path); 
} 

答えて

1

すべての画面の配列を返すScreens.AllScreens()方法を使用して、その上にループ:

foreach (var screen in Screens.AllScreens()) 
{ 
    bt = new Bitmap(screen.Bounds.Width, screen.Bounds.Height, PixelFormat.Format32bppArgb); 
    .... 
} 

これは、各画面の別個のビットマップ画像を取ります。すべての画面に対して1つのビットマップが必要な場合は、これらのビットマップを一緒にステッチするか、Ivan's approachを使用してすべての画面の結合範囲を取得する必要があります。

+0

これは私が探していたものでした。それは簡単ではないことを知っていませんでした。 –

0

あなたは1つのポイントから別のポイントに行くと言うので、使用することができるポイントを含む画面を取得するScreen.FromPointメソッド。

Screen screen = Screen.FromPoint(point); 

その後、あなたの代わりにscreenを使用するだけでScreen.PrimaryScreenを使用してどこ。

+0

これは非常に良いアプローチであり、メソッドがどのように機能しているかを説明しようとしていました。しかし、私は次のような何かをやっている小さなノートとしてこれを書き留めます、ありがとう! –

1

あなたはRectangle.Union方法とLINQを使用して画面の境界を組み合わせることができます。

var bounds = Screen.AllScreens.Select(s => s.Bounds).Aggregate(Rectangle.Union); 

その後、単にあなたのコード内のbounds変数にScreen.PrimaryScreen.Boundsを交換してください。

+0

これはまた、非常に良い解決策です!以前はLINQを使用していませんでしたが、私は非常に強力なことを聞​​いてきました –

関連する問題