截图出来是黑色的
Posted
技术标签:
【中文标题】截图出来是黑色的【英文标题】:Screenshot comes out black 【发布时间】:2014-03-19 14:08:07 【问题描述】:我正在尝试制作一个屏幕截图管理器和记录器,包括屏幕截图和视频,尽管后者对于这个问题并不重要。
用户可以选择一个他/她想要被捕获的进程并设置一个热键。
屏幕截图适用于常规桌面和某些游戏。但是,当尝试从某些游戏(例如细胞分裂黑名单)中截取屏幕截图时,如果这些游戏是全屏的,并且取决于 Windows 7 Aero,内容是黑色的,或者桌面显示的顶部有一个小条屏幕左侧。
这是我的初始代码:
public static Bitmap GetScreen()
Bitmap bmpScreenCapture = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
using (Graphics g = Graphics.FromImage(bmpScreenCapture))
g.CopyFromScreen(Screen.PrimaryScreen.Bounds.X,
Screen.PrimaryScreen.Bounds.Y,
0, 0,
bmpScreenCapture.Size,
CopyPixelOperation.SourceCopy);
return bmpScreenCapture;
在搜索过程中,我发现了一篇代码项目文章:
http://www.codeproject.com/Articles/274461/Very-fast-screen-capture-using-DirectX-in-Csharp
并对代码稍作修改
public Surface CaptureScreen()
Surface s = Surface.CreateOffscreenPlain(d, rc.Width, rc.Height, Format.A8R8G8B8, Pool.Scratch);
d.GetFrontBufferData(0, s);
Surface.ToFile(s, @"C:\test\img.jpg", ImageFileFormat.Jpg);
return s;
但是,该图像也会变成黑色。
有人对如何做到这一点有任何建议吗?
【问题讨论】:
【参考方案1】:使用此代码(我发现 here)在截取任何屏幕截图之前禁用 Aero,然后重新启用它。
public readonly uint DWM_EC_DISABLECOMPOSITION = 0;
public readonly uint DWM_EC_ENABLECOMPOSITION = 1;
[DllImport("dwmapi.dll", EntryPoint = "DwmEnableComposition")]
protected static extern uint Win32DwmEnableComposition(uint uCompositionAction);
public void ManageAero(bool a)
if (a)
Win32DwmEnableComposition(DWM_EC_ENABLECOMPOSITION );
if (!a)
Win32DwmEnableComposition(DWM_EC_DISABLECOMPOSITIO N);
【讨论】:
谢谢!它现在确实截取了一个很好的屏幕截图,但这会导致桌面窗口可见的小峰值。有什么办法吗?以上是关于截图出来是黑色的的主要内容,如果未能解决你的问题,请参考以下文章