C# 使用 SlimDX 获取窗口/桌面截图

Posted

技术标签:

【中文标题】C# 使用 SlimDX 获取窗口/桌面截图【英文标题】:C# Take window/desktop screenshot using SlimDX 【发布时间】:2017-12-31 21:07:23 【问题描述】:

我是 SlimDX 的新手,听说有一种方法可以使用此库捕获屏幕截图。我想使用 SlimDX 的原因是我想比

更快地捕获屏幕截图
Graphics.CopyFromScreen()

这样我就可以让直播应用以更高的帧速率运行。

我在互联网上找到了一些应该捕获桌面的代码,但它总是在我创建设备实例的那一行崩溃。

我尝试将 DeviceType 参数更改为 Software 并将 CreateFlags 更改为 Multithreaded 只是为了查看是否有任何变化,但没有任何变化,这就是它每次都说的:

SlimDX.Direct3D9.Direct3D9Exception: 'D3DERR_INVALIDCALL: 无效调用 (-2005530516)'

这是我的代码:

var pp = new PresentParameters();
pp.Windowed = true;
pp.SwapEffect = SwapEffect.Discard;

var d = new Device(new Direct3D(), 0, DeviceType.Hardware, IntPtr.Zero, CreateFlags.SoftwareVertexProcessing, pp);
var surface = Surface.CreateOffscreenPlain(d, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, Format.A8R8G8B8, Pool.Scratch);

d.GetFrontBufferData(0, surface);

//not sure if this will work
var ds = Surface.ToStream(surface, ImageFileFormat.Jpg);
var img = Image.FromStream(ds);

我也了解到这可能是显卡不支持 BackBuffer 的结果,但在这种情况下,我真的不知道如何解决这个问题。

我的显卡是AMD R270X

有什么想法吗?

【问题讨论】:

【参考方案1】:

pp.BackBufferCount 设置为0 有效。捕获时间仍然很长..

【讨论】:

你能展示代码你是如何实现游戏截图的吗?

以上是关于C# 使用 SlimDX 获取窗口/桌面截图的主要内容,如果未能解决你的问题,请参考以下文章

在 c# 中使用 win32 从窗口获取位图:我哪里出错了?

在 C# 中获取声音设备的名称

如何截取完整桌面Windows c#的屏幕截图[关闭]

c#如何获取鼠标选取的内容

ubuntu自定义截图截图

C#制作截图软件时,怎样不截取软件窗口本身? 看下图:软件自身也被截下来了