2016-11-08 36 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); 
    .... 
} 

這將需要每個屏幕的一個單獨的位圖圖像。如果你想爲所有屏幕使用單個位圖,那麼你需要將這些位圖拼接在一起,或者使用Ivan's approach來獲得所有屏幕的組合邊界。

+0

這就是我一直在尋找的東西,不知道那是如此簡單,我讓它變得如此複雜! –

0

你說你要從一個點到另一個點,所以要獲得包含點的屏幕,你可以使用Screen.FromPoint方法。

Screen screen = Screen.FromPoint(point); 

那麼無論你使用Screen.PrimaryScreen只使用screen代替。

+0

這是一個非常好的方法,我試圖解釋該方法是如何工作的。但我會在下次做這樣的事情時將它記下來,謝謝! –

1

您可以結合使用Rectangle.Union方法和LINQ屏幕的界限:

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

然後,只需在你的代碼bounds變量替換Screen.PrimaryScreen.Bounds

+0

這也是一個非常好的解決方案!以前從未使用過LINQ,但我聽說它非常強大! –

相關問題