截图显示为黑色

本文关键字:黑色 显示 | 更新日期: 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);
}