SharpDX를 사용하여 스크린 샷을 찍고 Windows Form에 그립니다.

Sthealt01

SharpDX를 사용하여 스크린 샷을 캡처하여 Windows Form (또는 패널)에 표시하려고하는데 문제가 있습니다. 을 사용하여 스크린 샷을 캡처 OutputDuplication.AcquireNextFrame했지만 캡처 된 프레임을 사용하려고 WindowRenderTarget.DrawBitmap하면 WrongResourceDomain 예외 와 함께 실패합니다 . Form을 추가하고 ScreenCapture 샘플 의 코드를 수정하여 문제를 설명했습니다.

using System;
using SharpDX;
using SharpDX.Direct2D1;
using SharpDX.Direct3D11;
using SharpDX.DXGI;

namespace MiniTri
{
    /// <summary>
    ///   Screen capture of the desktop using DXGI OutputDuplication.
    /// </summary>
    internal static class Program
    {

        [STAThread]
        private static void Main()
        {
            var Form1 = new ScreenCapture.Form1();

            // # of graphics card adapter
            const int numAdapter = 0;

            // # of output device (i.e. monitor)
            const int numOutput = 0;

            // Create DXGI Factory1
            var dxgiFactory = new SharpDX.DXGI.Factory1();
            var dxgiAdapter = dxgiFactory.GetAdapter1(numAdapter);

            // Create device from Adapter
            var d3dDevice = new SharpDX.Direct3D11.Device(dxgiAdapter, DeviceCreationFlags.BgraSupport);

            // Create Direct2D1 Factory1
            var d2dFactory = new SharpDX.Direct2D1.Factory1();

            // Create Direct2D device
            SharpDX.Direct2D1.Device d2dDevice;
            using (var dxgiDevice = d3dDevice.QueryInterface<SharpDX.DXGI.Device>())
                d2dDevice = new SharpDX.Direct2D1.Device(d2dFactory, dxgiDevice);

            // Get the Direct2D1 DeviceContext
            var d2dContext = new SharpDX.Direct2D1.DeviceContext(d2dDevice, DeviceContextOptions.None);

            // Create Direct2D1 WindowRenderTarget
            var WindowRenderTarget = new WindowRenderTarget(d2dFactory,
                                                            new RenderTargetProperties
                                                            {
                                                                Type = RenderTargetType.Default
                                                            },
                                                            new HwndRenderTargetProperties
                                                            {
                                                                Hwnd = Form1.Handle,
                                                                PixelSize = new Size2(Form1.Width, Form1.Height),
                                                                PresentOptions = PresentOptions.Immediately
                                                            });

            // Get DXGI.Output
            var output = dxgiAdapter.GetOutput(numOutput);
            var output1 = output.QueryInterface<Output1>();

            // Create RawRectangleF with the Form size
            var FormRectangle = new SharpDX.Mathematics.Interop.RawRectangleF(0, 0, Form1.Width, Form1.Height);

            // Duplicate the output
            var duplicatedOutput = output1.DuplicateOutput(d3dDevice);

            bool captureDone = false;
            for (int i = 0; !captureDone; i++)
            {
                try
                {
                    SharpDX.DXGI.Resource screenResource;
                    OutputDuplicateFrameInformation duplicateFrameInformation;

                    // Try to get duplicated frame within given time
                    duplicatedOutput.AcquireNextFrame(10000, out duplicateFrameInformation, out screenResource);

                    if (i > 0)
                    {
                        // Create a Direct2D1 Bitmap1 from screenResource
                        var dxgiSurface = screenResource.QueryInterface<Surface>();
                        var d2dBitmap1 = new Bitmap1(d2dContext, dxgiSurface);

                        // Should draw the bitmap on the form, but fails with "WrongResourceDomain" exception
                        WindowRenderTarget.BeginDraw();
                        WindowRenderTarget.DrawBitmap(d2dBitmap1, FormRectangle, 1.0f, BitmapInterpolationMode.Linear);
                        WindowRenderTarget.EndDraw();

                        // Capture done
                        captureDone = true;
                    }

                    screenResource.Dispose();
                    duplicatedOutput.ReleaseFrame();

                }
                catch (SharpDXException e)
                {
                    if (e.ResultCode.Code != SharpDX.DXGI.ResultCode.WaitTimeout.Result.Code)
                    {
                        throw e;
                    }
                }
            }

            // TODO: We should cleanp up all allocated COM objects here
        }
    }
}

프레임을 System.Drawing.Bitmap(원본 샘플에서와 같이) 로 변환 한 다음 사용 System.Drawing.Graphics.DrawImage하여 양식에 비트 맵을 그릴 수 있다는 것을 알고 있지만 이것을 피하고 SharpDX를 사용하여 프레임을 그리고 싶습니다. 나는 또한 ( MiniRect 샘플 과 유사 함)을 SwapChain사용하여 프레임 을 만들고 그리 려고 시도했지만 동일한 예외로 실패합니다. 사용하여 동일한 . 본인은 여기에 이 예외 수단은 내가 오전 것을 다른 자원 도메인의 자원을 혼합 ,하지만 난 내 코드에서 뜻을 정확히 이해하지 않습니다. DirectX 사용 경험이 없습니다.Direct2D1.RenderTarget.DrawBitmapDirect2D1.DeviceContext.DrawBitmap

Sthealt01

대신를 SwapChain다시 사용해 보았고 WindowRenderTarget이번에는 성공했습니다.

  • SwapChainDescription대상 컨트롤 (예 : 폼 또는 패널)의 특정 너비, 높이 및 핸들을 만듭니다 .
  • , 및을 SwapChain사용하여 새로 만듭니다 .dxgiFactoryd3dDeviceSwapChainDescription
  • 가져 오기 back buffer의를 SwapChain.
  • 에서 DXGI Surface가져옵니다 back buffer.

(기타의 생성에 대해 SwapChain, back buffer그리고 DXGI SurfaceMiniRect 샘플 )

  • 를 사용 d2dContext만들 Direct2D1.Bitmap1로부터를 DXGI Surface.
  • 를 사용하여 (위 코드에 설명 된대로) 에서 d2dContext다른 파일을 만듭니다 .Direct2D1.Bitmap1screenResource
  • 첫 번째 Direct2D1.Bitmap1d2dContext.
  • d2dContext두 번째 그리기를 사용하십시오 Direct2D1.Bitmap1.
  • 을 제시한다 SwapChain.
  • 끝난.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Nightwatch가 포함 된 BrowserStack에서 스크린 샷을 찍고 사용자 지정보고를 위해 해당 스크린 샷 URL을 가져옵니다.

분류에서Dev

Windows 10을 사용하여 스크린 샷을 찍을 수 없습니다.

분류에서Dev

GCLI를 사용하여 Firefox에서 전체 페이지의 고품질 스크린 샷을 찍는 방법은 무엇입니까?

분류에서Dev

C #을 사용하여 Windows 응용 프로그램에서 pdf로 선택한 영역의 스크린 샷을 찍습니다.

분류에서Dev

IP 주소를 사용하여 Java에서 스크린 샷을 찍는 방법

분류에서Dev

Windows 10에서 Windows 데스크톱 용 Skitch 스크린 샷을 찍기 위해 인쇄 키를 매핑하려면 어떻게해야합니까?

분류에서Dev

SSH를 통해 Gnome 데스크톱에서 스크린 샷을 찍고 가져옵니다.

분류에서Dev

SSH를 통해 Gnome 데스크톱에서 스크린 샷을 찍고 가져옵니다.

분류에서Dev

Puppeteer AWS Lambda를 사용하여 여러 페이로드를 반복하고 여러 스크린 샷을 찍습니다.

분류에서Dev

한 번의 PrtSc 키를 눌러 스크린 샷을 찍고 사용자 지정 폴더에 저장하는 방법은 무엇입니까?

분류에서Dev

각도기에서 html 스크린 샷을 사용하여 보고서를 생성 할 수 없습니다.

분류에서Dev

Windows 7에서 스크린 샷을 찍고 Mac과 같은 데스크탑에서 스크린 샷 파일을 자동 생성하는 방법은 무엇입니까?

분류에서Dev

파이썬을 사용하여 셀레늄에서 경고 상자의 스크린 샷을 찍을 수 없습니다

분류에서Dev

저장하지 않고 Twitter에 게시하는 것보다 스크린 샷을 찍습니다. iOS

분류에서Dev

JS를 통해 캔버스에 렌더링하지 않고 html5를 사용하여 웹 페이지의 스크린 샷을 찍는 방법

분류에서Dev

Python 모듈 pyautogui를 사용하여 스크린 샷을 찍고 날짜 및 시간별로 .png 파일 이름을 자동으로 지정합니다.

분류에서Dev

캡처 도구를 사용하여 Windows 8 시작 화면 또는 최신 앱의 스크린 샷을 찍을 수 있습니까?

분류에서Dev

캡처 도구를 사용하여 Windows 8 시작 화면 또는 최신 앱의 스크린 샷을 찍을 수 있습니까?

분류에서Dev

영역을 선택하여 pyqt 스크립트에서 스크린 샷 찍기

분류에서Dev

"screenshot --fullpage"를 사용하여 전체 페이지 스크린 샷을 찍을 수 없습니다.

분류에서Dev

어쨌든 javascript (node.js 전용) (discord 봇)를 사용하여 스크린 샷을 찍을 수 있습니까?

분류에서Dev

백그라운드에서 스크린 샷을 찍고 저장하기 전에 처리

분류에서Dev

스크린 샷을 찍고 터미널을 통해 이미지를 imgur에 업로드하는 방법은 무엇입니까?

분류에서Dev

최근에 Windows 8.1에서 스크린 샷을 찍는 데 문제가있는 사람이 있습니까?

분류에서Dev

특정 웹 사이트 너비를 사용하여 PHP로 URL의 스크린 샷을 찍습니까?

분류에서Dev

wkhtmltoimage에서 스크린 샷을 찍을 때 크기를 지정하는 방법은 무엇입니까?

분류에서Dev

Windows에서 큰 폴더 내용의 단일 스크린 샷을 찍는 방법

분류에서Dev

Firefox를 사용하여 명령 줄에서 전체 페이지 스크린 샷을 찍으려면 어떻게해야합니까?

분류에서Dev

Kubuntu 16.04.3에서 키보드 콤보를 사용하여 스크린 샷을 찍는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    Nightwatch가 포함 된 BrowserStack에서 스크린 샷을 찍고 사용자 지정보고를 위해 해당 스크린 샷 URL을 가져옵니다.

  2. 2

    Windows 10을 사용하여 스크린 샷을 찍을 수 없습니다.

  3. 3

    GCLI를 사용하여 Firefox에서 전체 페이지의 고품질 스크린 샷을 찍는 방법은 무엇입니까?

  4. 4

    C #을 사용하여 Windows 응용 프로그램에서 pdf로 선택한 영역의 스크린 샷을 찍습니다.

  5. 5

    IP 주소를 사용하여 Java에서 스크린 샷을 찍는 방법

  6. 6

    Windows 10에서 Windows 데스크톱 용 Skitch 스크린 샷을 찍기 위해 인쇄 키를 매핑하려면 어떻게해야합니까?

  7. 7

    SSH를 통해 Gnome 데스크톱에서 스크린 샷을 찍고 가져옵니다.

  8. 8

    SSH를 통해 Gnome 데스크톱에서 스크린 샷을 찍고 가져옵니다.

  9. 9

    Puppeteer AWS Lambda를 사용하여 여러 페이로드를 반복하고 여러 스크린 샷을 찍습니다.

  10. 10

    한 번의 PrtSc 키를 눌러 스크린 샷을 찍고 사용자 지정 폴더에 저장하는 방법은 무엇입니까?

  11. 11

    각도기에서 html 스크린 샷을 사용하여 보고서를 생성 할 수 없습니다.

  12. 12

    Windows 7에서 스크린 샷을 찍고 Mac과 같은 데스크탑에서 스크린 샷 파일을 자동 생성하는 방법은 무엇입니까?

  13. 13

    파이썬을 사용하여 셀레늄에서 경고 상자의 스크린 샷을 찍을 수 없습니다

  14. 14

    저장하지 않고 Twitter에 게시하는 것보다 스크린 샷을 찍습니다. iOS

  15. 15

    JS를 통해 캔버스에 렌더링하지 않고 html5를 사용하여 웹 페이지의 스크린 샷을 찍는 방법

  16. 16

    Python 모듈 pyautogui를 사용하여 스크린 샷을 찍고 날짜 및 시간별로 .png 파일 이름을 자동으로 지정합니다.

  17. 17

    캡처 도구를 사용하여 Windows 8 시작 화면 또는 최신 앱의 스크린 샷을 찍을 수 있습니까?

  18. 18

    캡처 도구를 사용하여 Windows 8 시작 화면 또는 최신 앱의 스크린 샷을 찍을 수 있습니까?

  19. 19

    영역을 선택하여 pyqt 스크립트에서 스크린 샷 찍기

  20. 20

    "screenshot --fullpage"를 사용하여 전체 페이지 스크린 샷을 찍을 수 없습니다.

  21. 21

    어쨌든 javascript (node.js 전용) (discord 봇)를 사용하여 스크린 샷을 찍을 수 있습니까?

  22. 22

    백그라운드에서 스크린 샷을 찍고 저장하기 전에 처리

  23. 23

    스크린 샷을 찍고 터미널을 통해 이미지를 imgur에 업로드하는 방법은 무엇입니까?

  24. 24

    최근에 Windows 8.1에서 스크린 샷을 찍는 데 문제가있는 사람이 있습니까?

  25. 25

    특정 웹 사이트 너비를 사용하여 PHP로 URL의 스크린 샷을 찍습니까?

  26. 26

    wkhtmltoimage에서 스크린 샷을 찍을 때 크기를 지정하는 방법은 무엇입니까?

  27. 27

    Windows에서 큰 폴더 내용의 단일 스크린 샷을 찍는 방법

  28. 28

    Firefox를 사용하여 명령 줄에서 전체 페이지 스크린 샷을 찍으려면 어떻게해야합니까?

  29. 29

    Kubuntu 16.04.3에서 키보드 콤보를 사용하여 스크린 샷을 찍는 방법은 무엇입니까?

뜨겁다태그

보관