屏幕截图显示为黑色

时间:2014-03-19 14:08:07

标签: c# directx screenshot

我正在尝试制作一个屏幕截图管理器&记录器,截图和视频,虽然后者对这个问题并不重要。

用户可以选择他/她想要捕获的进程并设置热键。

截图适用于常规桌面和一些游戏。但是,当尝试从某些游戏(例如Splinter Cell Blacklist)捕获屏幕截图时,如果这些游戏是全屏的,并且取决于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 个答案:

答案 0 :(得分:0)

使用此代码(我发现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);
}