【问题标题】:Desktop capture using directX 11使用 directX 11 进行桌面捕获
【发布时间】:2016-01-21 20:02:59
【问题描述】:

我正在尝试使用 Direct 11 和 SlimDX 捕获桌面图像。但我不知道如何使用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 捕获桌面图像? 如果有人能回答,那将非常有帮助。

【问题讨论】:

  • 不清楚。您想要后缓冲还是监控桌面?
  • 我想用 DirectX 11 获取桌面窗口的图像。所以我需要获取桌面窗口的后台缓冲区。 DirectX 9 有一个名为“GetBackBuffer”的函数来获取桌面的后台缓冲区。但我找不到使用 DirectX 11 获取桌面后台缓冲区的任何功能或任何方法。

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


【解决方案1】:

如果您创建了交换链,则可以使用交换链获取任何缓冲区,主要或次要缓冲区。

D3D11.Texture2D backBuffer = swapChain.GetBackBuffer<D3D11.Texture2D>(0)

第二种方法:在 SlimDX 中,您可以使用 Resource.FromSwapChain 方法获得 backbuffer

using (var resource = Resource.FromSwapChain<Texture2D>(swapChain, 0))
    renderTarget = new RenderTargetView(device, resource);

详情看这个链接,这个人已经详细解释了https://slimdx.org/tutorials/DeviceCreation.php

【讨论】:

  • 但是使用这个我们只能得到我们创建的swapChain的后台缓冲区。不是吗?如何获取桌面的后台缓冲区?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
  • 2017-11-08
  • 1970-01-01
相关资源
最近更新 更多