我正在尝试使用带有SlimDX的Direct 11来捕获桌面图像。但我不知道如何使用directX 11为监视器桌面获取后台缓冲区。我用这样的C#尝试了这个。为什么它不能获得桌面的后台缓冲区?
[DllImport("user32.dll", SetLastError = false)]
static extern IntPtr GetDesktopWindow();
Device device1;
SwapChain swapChain1;
var description1 = new SwapChainDescription()
{
BufferCount = 1,
Usage = Usage.ReadOnly,
OutputHandle = GetDesktopWindow(),
IsWindowed = true,
ModeDescription = new ModeDescription(0, 0, new Rational(60, 1), Format.R8G8B8A8_UNorm),
SampleDescription = new SampleDescription(1, 0),
Flags = SwapChainFlags.AllowModeSwitch,
SwapEffect = SwapEffect.Sequential
};
Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.None, description, out device1, out swapChain1);
var resource1 = Resource.FromSwapChain<Texture2D>(swapChain1, 0);
SlimDX.Direct3D11.Texture2D.SaveTextureToFile(context, resource1, ImageFileFormat.Png, "D:\\MyImage");
如果不是这种方式不起作用怎么能用directX 11捕获桌面图像? 如果有人能回答,那将非常有帮助。
答案 0 :(得分:0)
如果你已经创建了交换链,你可以使用交换链获得任何缓冲区,主要或次要。
D3D11.Texture2D backBuffer = swapChain.GetBackBuffer<D3D11.Texture2D>(0)
第二种方法:在SlimDX中,您可以使用 Resource.FromSwapChain 方法获取后备缓冲区
using (var resource = Resource.FromSwapChain<Texture2D>(swapChain, 0))
renderTarget = new RenderTargetView(device, resource);
有关详细信息,请查看此链接,此人详细解释了https://slimdx.org/tutorials/DeviceCreation.php