2012-04-27 28 views
4

我正在使用System.Drawing.Graphics.CopyFromScreen獲取桌面的部分屏幕截圖。我注意到一些好奇的行爲。在某些機器上,當應用程序(WPF)窗口的AllowsTransparency =「True」時,調用CopyFromScreen將捕獲窗口下方的內容。但在其他機器上,它也捕獲了調用窗口。Graphics.CopyFromScreen有時會捕獲透明窗口,有時不會

我試過它在很多機器和操作系統上,還沒有找到模式。在透明窗口下捕獲的XP和Windows 7筆記本電腦上。在我們擁有的一個Windows 7桌面上,它捕獲窗口本身。 Aero或其他Windows 7顯示功能似乎沒有任何區別。

難道是顯卡問題?是否有任何方法可以在所有機器上獲得一致的行爲,或預測或檢測何時會發生此問題?

編輯感謝Hans Passant提供的鏈接以及一些進一步的測試,現在我明白這個問題只與窗口透明相關。在某些機器上,CopyFromScreen捕獲所有窗口,在其他機器上它只捕獲非透明窗口。

回答

4

不太確定有時不行爲。自Aero以來,分層窗戶表現得很奇特。什麼是明確的是,Graphics.CopyFromScreen()默認情況下不會捕獲分層窗口,除非您使用指定CopyPixelOperation的重載。所需的選項是CaptureBlt,描述爲:被鋪在你的窗口上方都包含在所得圖像中

的Windows。默認情況下,圖像僅包含您的窗口。

這是不準確的,「你的窗口」不會,如果它是一個分層的窗口抓獲。更糟糕的是該方法有一個錯誤。你不僅需要CaptureBlt,還需要SourceCopy。參數驗證代碼不允許使用這種組合,當您嘗試使用它時,您會得到一個InvalidEnumArgumentException。

那麼,GDI +是一個包的臭蟲。你會發現你需要在this answer中解決這個難題的密碼。

+0

謝謝。我會檢查出來的。 – Sugrue 2012-04-27 16:32:45

+0

該答案鏈接很有趣。在我的情況下,我不想捕捉半透明窗口。我仍然不明白爲什麼相同的應用程序在不同的系統上表現不同。 – Sugrue 2012-04-27 16:53:17

+0

我沒有從問題中得知。解決方法就是隱藏你的窗戶並旋轉你的腳後跟幾秒鐘,以便所有未被遮擋的窗戶都有機會自己畫。 – 2012-04-27 16:56:34

相關問題