2008-10-08 9 views
1

그래픽이 매우 집중적이고 DirectX 및 Windows Forms에서 작성된 응용 프로그램이 있습니다. 자동화 된 테스트 시스템이 구축 된 자동화 및 재생 프레임 워크가 있습니다. 불행히도 야간에 테스트가 진행되는 동안 화면이 비활성 상태이거나 화면 보호기와 연결되어있어 IT 보안 정책에 따라 화면 보호 기능을 사용 중지 할 수 없습니다.Windows Forms : 비 그래픽으로 실행될 때 화면 캡처 (예 : 화면 보호기가 활성화 됨)

내 질문 : 디스플레이없이 실행중인 응용 프로그램의 "화면"캡처를 수행하는 방법이 있습니까? 렌더링 파이프 라인이 같아 지도록 그래픽 카드를 사용하고 싶지만 테스팅 프레임 워크는 디스플레이의 상태를 신경 쓸 필요가 없습니다.

도움을 주시면 감사하겠습니다.

답변

2

파이프 라인 렌더링에 대해 언급 했으므로 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를 호출하는 것, 즉 당신의 선택의 어떤 프로그래밍 언어를 할 변환 할 수 있었다. 비록, 당신은 그러나 당신이 또한 PresentParams.PresentFlag = PresentFlag.LockableBackBuffer

을 설정하여 엄청난 속도 향상을 얻을 수 있습니다, 당신은이 코드는 정말 느린 찾을 수 있습니다

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

PresentParameters 및 Device에 대한 전체 선언으로 사용할 것을 보여 줄 수 있습니까? 나는 D3D를 사용하여 이틀 동안 스크린 레코더를 만들려고 노력했지만 아무런 운이 없었습니다. 제공 한 작은 스 니펫을 사용하여 내 장치 생성자에서 InvalidCallException을 계속 가져옵니다. –

+0

이를 위해 일부 파기가 필요할 것입니다. 그 동안 DirectX 런타임에 대한 디버그 모드를 설정 했습니까? 그렇다면 DebugView를 사용하여 디버그 메시지를 살펴보십시오. 위의 2와 충돌하는 매개 변수를 알려줍니다. 알다시피, 몇 가지 매개 변수가 특정 콤보에서 작동해야합니다. 그래도 문제가 해결되지 않으면 내일 코드를 게시 해 보겠습니다. – faulty

0

VM을 설치하고 그 안에 응용 프로그램을 실행하십시오. 화면 보호기를 사용하고 있다면 비디오 카드가 응용 프로그램의 GUI를 생성하는 것조차 의심 스럽습니다.

0

내가 올바르게 이해했다면 원하는 응용 프로그램의 화면 잡기가 가능하고 결과가 실행중인 화면 보호기의 영향을받지 않을까요? 내가 아는 한, 올바른 윈도우의 HDC에서 GetDIBits을 수행하는 것만으로도 화면 보호기에 신경 쓰지 않아도됩니다.

+0

이렇게하면 화면 보호기가 포함되어있는 화면이 캡처됩니다. 나는 이것을 테스트 해 보지 못했지만,이 방법을 사용하여 "캡쳐 화면"과 같은 더 복잡한 캡쳐로 캡쳐 할 수있었습니다. – faulty

+0

나는 틀림없이 당신이 틀렸다는 것을 확신하지만, 그것을 증명할 수있는 몇 가지 테스트 코드 작성) – korona

0

로 백 버퍼를 구성해야와 현재 매개 변수, 당신은하지 않습니다 PresentInterval.One 또는 SwapEffect.Flip으로 설정해야하며, 기본값과 .Discard에 그대로 둘 수 있습니다.

(이 속도 향상, 당신은 멀티 샘플링을 사용하는 경우 작동 PresentParams.Multisample = Multisample.None 있는지 확인하지 않습니다. 당신은 엔비디아 카드가있는 경우 여전히에 대한 응용 프로그램 설정을 무시하기 위해 엔비디아 컨트롤 패널에서 옵션을 설정하여 안티 앨리어싱을 얻을 수있는 원하는)!