Пример #1
0
        public Window PickWindow(IEnumerable <IntPtr> SkipWindows = null)
        {
            var picker = new WindowPicker(SkipWindows);

            picker.ShowDialog();

            return(picker.SelectedWindow);
        }
        public void StartCapture(IntPtr hWnd, Device device, Factory factory)
        {
            var picker = new WindowPicker();

            _hWnd = picker.PickCaptureTarget(hWnd);
            if (_hWnd == IntPtr.Zero)
            {
                return;
            }

            IsCapturing = true;
        }
        public void StartCapture(IntPtr hWnd, Device device, Factory factory)
        {
            #region GraphicsCapturePicker version

            /*
             * var capturePicker = new GraphicsCapturePicker();
             *
             * // ReSharper disable once PossibleInvalidCastException
             * // ReSharper disable once SuspiciousTypeConversion.Global
             * var initializer = (IInitializeWithWindow)(object)capturePicker;
             * initializer.Initialize(hWnd);
             *
             * _captureItem = capturePicker.PickSingleItemAsync().AsTask().Result;
             */

            #endregion

            #region Window Handle version

            var capturePicker = new WindowPicker();
            var captureHandle = capturePicker.PickCaptureTarget(hWnd);
            if (captureHandle == IntPtr.Zero)
            {
                return;
            }

            _captureItem = CreateItemForWindow(captureHandle);

            #endregion

            if (_captureItem == null)
            {
                return;
            }

            _captureItem.Closed += CaptureItemOnClosed;

            var hr = NativeMethods.CreateDirect3D11DeviceFromDXGIDevice(device.NativePointer, out var pUnknown);
            if (hr != 0)
            {
                StopCapture();
                return;
            }

            var winrtDevice = (IDirect3DDevice)Marshal.GetObjectForIUnknown(pUnknown);
            Marshal.Release(pUnknown);

            _captureFramePool = Direct3D11CaptureFramePool.Create(winrtDevice, DirectXPixelFormat.B8G8R8A8UIntNormalized, 2, _captureItem.Size);
            _captureSession   = _captureFramePool.CreateCaptureSession(_captureItem);
            _captureSession.StartCapture();
            IsCapturing = true;
        }