public override void Dispose() { if (dx11Device != null) dx11Device.Dispose(); if (dx11Factory != null) dx11Factory.Dispose(); if (dx11Output != null) dx11Output.Dispose(); if (dx11DuplicatedOutput != null) dx11DuplicatedOutput.Dispose(); if (dx11ScreenTexture != null) dx11ScreenTexture.Dispose(); if (dx11ScreenResource != null) dx11ScreenResource.Dispose(); if (dx11ScreenSurface != null) dx11ScreenSurface.Dispose(); if (screenShot != null) screenShot.Dispose(); dx11Device = null; dx11Factory = null; dx11Output = null; dx11DuplicatedOutput = null; dx11ScreenTexture = null; dx11ScreenResource = null; dx11ScreenSurface = null; screenShot = null; bmpData = null; GC.SuppressFinalize(this); }
public ScreenManager(int adapterIndex, int outputIndex) { using (var adapter = InitializeAdapter(adapterIndex)) { _device = new Device(adapter); using(var output = InitializeOutput(adapter, outputIndex)) { _desktopBounds = output.Description.DesktopBounds; _outputDuplication = InitializeOutputDuplication(output); _texture2DDescription = InitializeTexture2DDescription(_desktopBounds); } } }
private void Reset() { using (Factory1 DXGIfactory = new Factory1()) { Adapter1 adapter; if (DXGIfactory.Adapters1[0].Outputs.Length == 0) { adapter = DXGIfactory.Adapters1[1]; } else { adapter = DXGIfactory.Adapters1[0]; } Output1 output = adapter.Outputs[0].QueryInterface<Output1>(); this.duplicatedOutput = output.DuplicateOutput(this.device); } }
/// <summary> /// Init some variables one times to spend execution time. /// </summary> public DirectX() { try { factory = new Factory1(); adapter = factory.GetAdapter1(numAdapter); device = new Device(adapter); output = adapter.GetOutput(numOutput); output1 = output.QueryInterface<Output1>(); // get screen wize textureDesc = new Texture2DDescription { CpuAccessFlags = CpuAccessFlags.Read, BindFlags = BindFlags.None, Format = Format.B8G8R8A8_UNorm, Width = ((SharpDX.Mathematics.Interop.RawRectangle)output.Description.DesktopBounds).Right - ((SharpDX.Mathematics.Interop.RawRectangle)output.Description.DesktopBounds).Left, Height = ((SharpDX.Mathematics.Interop.RawRectangle)output.Description.DesktopBounds).Bottom - ((SharpDX.Mathematics.Interop.RawRectangle)output.Description.DesktopBounds).Top, OptionFlags = ResourceOptionFlags.None, MipLevels = 1, ArraySize = 1, SampleDescription = { Count = 1, Quality = 0 }, Usage = ResourceUsage.Staging }; screenTexture = new Texture2D(device, textureDesc); duplicatedOutput = output1.DuplicateOutput(device); } catch (Exception ex) { throw ex; } }
/// <summary> /// Duplicates the output of the specified monitor on the specified graphics adapter. /// </summary> /// <param name="whichGraphicsCardAdapter">The adapter which contains the desired outputs.</param> /// <param name="whichOutputDevice">The output device to duplicate (i.e. monitor). Begins with zero, which seems to correspond to the primary monitor.</param> public DesktopDuplicator(int whichGraphicsCardAdapter, int whichOutputDevice) { this.mWhichOutputDevice = whichOutputDevice; Adapter1 adapter = null; try { adapter = new Factory1().GetAdapter1(whichGraphicsCardAdapter); } catch (SharpDXException) { throw new DesktopDuplicationException("Could not find the specified graphics card adapter."); } this.mDevice = new Device(adapter); Output output = null; try { output = adapter.GetOutput(whichOutputDevice); } catch (SharpDXException) { throw new DesktopDuplicationException("Could not find the specified output device."); } var output1 = output.QueryInterface<Output1>(); this.mOutputDesc = output.Description; this.mTextureDesc = new Texture2DDescription() { CpuAccessFlags = CpuAccessFlags.Read, BindFlags = BindFlags.None, Format = Format.B8G8R8A8_UNorm, Width = this.mOutputDesc.DesktopBounds.Width, Height = this.mOutputDesc.DesktopBounds.Height, OptionFlags = ResourceOptionFlags.None, MipLevels = 1, ArraySize = 1, SampleDescription = { Count = 1, Quality = 0 }, Usage = ResourceUsage.Staging }; try { this.mDeskDupl = output1.DuplicateOutput(mDevice); } catch (SharpDXException ex) { if (ex.ResultCode.Code == SharpDX.DXGI.ResultCode.NotCurrentlyAvailable.Result.Code) { throw new DesktopDuplicationException("There is already the maximum number of applications using the Desktop Duplication API running, please close one of the applications and try again."); } } }
/// <summary> /// Init some variables one times to spend execution time. /// </summary> public DirectX() { try { factory = new Factory1(); adapter = factory.GetAdapter1(numAdapter); device = new Device(adapter); output = adapter.GetOutput(numOutput); output1 = output.QueryInterface<Output1>(); // get screen wize textureDesc = new Texture2DDescription { CpuAccessFlags = CpuAccessFlags.Read, BindFlags = BindFlags.None, Format = Format.B8G8R8A8_UNorm, Width = ((SharpDX.Mathematics.Interop.RawRectangle)output.Description.DesktopBounds).Right - ((SharpDX.Mathematics.Interop.RawRectangle)output.Description.DesktopBounds).Left, Height = ((SharpDX.Mathematics.Interop.RawRectangle)output.Description.DesktopBounds).Bottom - ((SharpDX.Mathematics.Interop.RawRectangle)output.Description.DesktopBounds).Top, OptionFlags = ResourceOptionFlags.None, MipLevels = 1, ArraySize = 1, SampleDescription = { Count = 1, Quality = 0 }, Usage = ResourceUsage.Staging }; screenTexture = new Texture2D(device, textureDesc); try { duplicatedOutput = output1.DuplicateOutput(device); } catch (SharpDXException e) { if (e.ResultCode.Code == SharpDX.DXGI.ResultCode.Unsupported.Result.Code) { throw new System.ApplicationException("Your system does not support DirectX 11.2 (normally on windows 7). Please use 'Use GDI Capture' option to prevent this error!"); } else { throw e; } } } catch (Exception ex) { throw ex; } }
public ScreenDublicator() { Adapter adapter = null; Output output = null; Output1 output1 = null; try { //Адаптер adapter = new Factory1().GetAdapter1(this.ADAPTER); //Устройство this._device = new Device(adapter); output = adapter.GetOutput(this.MONITOR); //Выход output1 = output.QueryInterface<Output1>(); this._outputDesc = output.Description; this._width = this._outputDesc.DesktopBounds.Right - this._outputDesc.DesktopBounds.Left; this._height = this._outputDesc.DesktopBounds.Bottom - this._outputDesc.DesktopBounds.Top; this._textureDesc = new Texture2DDescription() { CpuAccessFlags = CpuAccessFlags.Read, BindFlags = BindFlags.None, Format = Format.B8G8R8A8_UNorm, Width = this._width, Height = this._height, OptionFlags = ResourceOptionFlags.None, MipLevels = 1, ArraySize = 1, SampleDescription = { Count = 1, Quality = 0 }, Usage = ResourceUsage.Staging }; this._outputDublication = output1.DuplicateOutput(this._device); //Текстура this._desktopTexture = new Texture2D(this._device, this._textureDesc); } catch(SharpDXException sdxex) { if (sdxex.ResultCode.Code == SharpDX.DXGI.ResultCode.NotCurrentlyAvailable.Result.Code) { throw new ScreenDublicatorException("Достигнут предел приложений, работающих с API)"); } else { string message = String.Format("Не удалось создать дублирующий выход"); Debug.WriteLine(message + "\n{0}\n{1}", sdxex.Message, sdxex.StackTrace); throw new ScreenDublicatorException(message); } } catch(Exception ex) { string message = String.Format("Ошибка при инициализации объекта\n{0}\n{1}", ex.Message, ex.StackTrace); throw new ScreenDublicatorException(message); } finally { if(adapter != null) { adapter.Dispose(); } if(output != null) { output.Dispose(); } if(output1 != null) { output1.Dispose(); } } }
private void InitGrabber() { try { this.pixelFormat = PixelFormat.Format32bppRgb; boundsRect = new System.Drawing.Rectangle(0, 0, WIDTH, HEIGHT); uint numAdapter = 0; // # of graphics card adapter uint numOutput = 0; // # of output device (i.e. monitor) // create device and factory dx11Device = new SharpDX.Direct3D11.Device(SharpDX.Direct3D.DriverType.Hardware); dx11Factory = new Factory1(); dx11Output = new Output1(dx11Factory.Adapters1[numAdapter].Outputs[numOutput].NativePointer); // creating CPU-accessible texture resource dx11Texture2Ddescr = new SharpDX.Direct3D11.Texture2DDescription(); dx11Texture2Ddescr.CpuAccessFlags = SharpDX.Direct3D11.CpuAccessFlags.Read; dx11Texture2Ddescr.BindFlags = SharpDX.Direct3D11.BindFlags.None; dx11Texture2Ddescr.Format = SharpDX.DXGI.Format.B8G8R8A8_UNorm; dx11Texture2Ddescr.Height = HEIGHT; dx11Texture2Ddescr.Width = WIDTH; dx11Texture2Ddescr.OptionFlags = SharpDX.Direct3D11.ResourceOptionFlags.None; dx11Texture2Ddescr.MipLevels = 1; dx11Texture2Ddescr.ArraySize = 1; dx11Texture2Ddescr.SampleDescription.Count = 1; dx11Texture2Ddescr.SampleDescription.Quality = 0; dx11Texture2Ddescr.Usage = SharpDX.Direct3D11.ResourceUsage.Staging; dx11ScreenTexture = new SharpDX.Direct3D11.Texture2D(dx11Device, dx11Texture2Ddescr); // duplicate output stuff dx11DuplicatedOutput = dx11Output.DuplicateOutput(dx11Device); } catch (SharpDX.SharpDXException dxe) { string error = "Directx 11 initializer error.\n" + dxe.Message; LdpLog.Error(error); MessageBox.Show(error, "Error", MessageBoxButton.OK, MessageBoxImage.Error); } catch (Exception ex) { string error = "Directx 11 initializer error.\n" + ex.Message; LdpLog.Error(error); MessageBox.Show(error, "Error", MessageBoxButton.OK, MessageBoxImage.Error); } }
public void setupDX() { try { // # of graphics card adapter const int numAdapter = 0; // # of output device (i.e. monitor) const int numOutput = 0; //const string outputFileName = "ScreenCapture.png"; // Create DXGI Factory1 var factory = new Factory1(); var adapter = factory.GetAdapter1(numAdapter); // Create device from Adapter device = new SharpDX.Direct3D11.Device(adapter); // Get DXGI.Output var output = adapter.GetOutput(numOutput); var output1 = output.QueryInterface <Output1>(); // Width/Height of desktop to capture int width = ((SharpDX.Rectangle)output.Description.DesktopBounds).Width; int height = ((SharpDX.Rectangle)output.Description.DesktopBounds).Height; // Create Staging texture CPU-accessible var textureDesc = new Texture2DDescription { CpuAccessFlags = CpuAccessFlags.Read, BindFlags = BindFlags.None, Format = Format.B8G8R8A8_UNorm, Width = width, Height = height, OptionFlags = ResourceOptionFlags.None, MipLevels = 1, ArraySize = 1, SampleDescription = { Count = 1, Quality = 0 }, Usage = ResourceUsage.Staging }; screenTexture = new Texture2D(device, textureDesc); // Duplicate the output duplicatedOutput = output1.DuplicateOutput(device); } catch (SharpDXException e) { if (device != null) { device.Dispose(); } if (screenTexture != null) { screenTexture.Dispose(); } if (duplicatedOutput != null) { duplicatedOutput.Dispose(); } device = null; if (e.ResultCode.Code == SharpDX.DXGI.ResultCode.AccessDenied.Result.Code) { device = null; } //else throw e; } catch (Exception e) { throw e; } // TODO: We should cleanp up all allocated COM objects here }