Windows Forms : 그래프로 실행할 때 화면 캡처 (IE Screensaver가 활성화 됨)

StackOverflow https://stackoverflow.com/questions/183118

  •  06-07-2019
  •  | 
  •  

문제

매우 그래픽이 많고 DirectX 및 Windows 양식에 구축 된 응용 프로그램이 있습니다. 자동화 및 재생 프레임 워크가있어 자동 테스트 시스템이 구축됩니다. 불행히도, 야간 빌드 중에 테스트가 무인으로 실행되면 디스플레이는 비활성화되거나 스크린 세이버와 연결되어 있으며 IT 보안 정책으로 인해이를 비활성화 할 수 없습니다.

그래서 내 질문 : 디스플레이없이 실행중인 응용 프로그램의 "화면"캡처를 수행하는 방법이 있습니까? 렌더링 파이프 라인이 동일하도록 그래픽 카드가 참여했는지 확인하고 싶지만 테스트 프레임 워크는 디스플레이 상태를 신경 쓰지 않아도됩니다.

어떤 도움을 주셔서 감사합니다!

도움이 되었습니까?

해결책

렌더링 파이프 라인이 언급되었으므로 Direct3D를 사용하고 있다고 가정하고 있다면 프레임의 백 버퍼를 저장할 수 있습니다. 아직도 vb.net + mdx를 사용할 때 그렇게했습니다.

Dim tempSurface As Direct3D.Surface
tempSurface = device.GetBackBuffer(0, 0, Direct3D.BackBufferType.Mono)
Direct3D.SurfaceLoader.Save(tempFilename, Direct3D.ImageFileFormat.Png, tempSurface)

선택한 프로그래밍 언어를 수행하는 것을 쉽게 변환 할 수 있습니다. 기본적으로 Direct3D의 API를 호출합니다. 그러나 백부퍼와 현재 매개 변수를 다음과 같이 구성해야합니다.

' Need to use flip to enable screen capture
presentParams.SwapEffect = Direct3D.SwapEffect.Flip 
presentParams.PresentationInterval = Direct3D.PresentInterval.One

다른 팁

VM을 설치하고 응용 프로그램을 실행하십시오. 화면 보호기를 실행하는 경우 비디오 카드가 응용 프로그램의 GUI를 생성하는 것도 의심합니다.

내가 올바른 것을 이해한다면, 당신이 원하는 것은 특정 응용 프로그램의 화면을 잡고 결과가 스크린 세이버의 영향을받지 않으면? 내가 아는 한, 단순히하는 것 GetDIBits 올바른 창의 HDC에서 트릭을 수행하고 스크린 세이버에 신경 쓰지 않아야합니다.

이 코드는 정말 느리게 될 수 있지만 설정하여 대규모 속도를 얻을 수 있습니다. PresentParams.PresentFlag = PresentFlag.LockableBackBuffer

또한 설정할 필요가 없습니다 PresentInterval.One 또는 SwapEffect.Flip, 그들은 .Default에 남겨질 수 있으며.

(멀티 샘플링을 사용하는 경우이 속도 업이 작동하지 않습니다. PresentParams.Multisample = Multisample.None . NVIDIA 카드가있는 경우 NVIDIA 제어판에서 옵션을 설정하여 응용 프로그램 설정을 원하는 대상으로 무시하여 항아리아를 얻을 수 있습니다!)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top