我正在尝试制作一个屏幕截图管理器&记录器,截图和视频,虽然后者对这个问题并不重要。
用户可以选择他/她想要捕获的进程并设置热键。
截图适用于常规桌面和一些游戏。但是,当尝试从某些游戏(例如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;
}
然而,该图像也是黑色的。
有没有人对如何做到这一点有任何建议?
答案 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);
}