2016-01-21 185 views
0

我正在尝试使用SlimDX使用Direct 11捕获桌面图像。但是我不知道如何在显示器桌面上使用directX 11获得后台缓冲区。我试过这样的C#就像这样。为什么它没有得到桌面的后台缓冲区?使用directX进行桌面捕获11

[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

它没有解释它明确。你想要backbuffer还是监视桌面? –

+0

我想用DirectX 11获取桌面窗口的图像。所以我需要获取桌面窗口的后台缓冲区。 DirectX 9有一个名为“GetBackBuffer”的函数来获取桌面的后台缓冲区。但是我没有找到任何功能或任何方式来获得DirectX 11桌面的后台缓冲区。 –

回答

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

+0

但是,使用这个我们只能得到我们创建的swapChain的后台缓冲区。不是吗?我怎样才能得到桌面的后台缓冲区? –