使用directX 11进行桌面捕获

时间:2016-01-21 20:02:59

标签: directx screenshot directx-11 directx-9 slimdx

我正在尝试使用带有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捕获桌面图像? 如果有人能回答,那将非常有帮助。

1 个答案:

答案 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