截图显示为黑色
本文关键字:黑色 显示 | 更新日期: 2023-09-27 17:51:00
我想做一个屏幕截图管理器&记录器,都是截图&;视频,尽管后者对这个问题并不重要。
用户可以选择他/她想要捕获的进程并设置热键。
屏幕截图在普通桌面和一些游戏中运行良好。然而,当试图从某些游戏(如《细胞分裂:黑名单》)中抓取截图时,如果这些游戏是全屏的,并且依赖于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;
}
然而,同样的图像是黑色的。
有谁对如何做到这一点有什么建议吗?
使用以下代码(我在这里找到的)在截取任何屏幕截图之前禁用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);
}