2016-01-21 104 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的後臺緩衝區。不是嗎?我怎樣才能得到桌面的後臺緩衝區? –