Windows Forms: Captura de tela durante a execução não-graficamente (ou seja screensaver está ativo)

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

  •  06-07-2019
  •  | 
  •  

Pergunta

Eu tenho um aplicativo que é muito gráficos intensivos e construído sobre DirectX e Windows Forms. Tem uma automação e repetição em torno quadro que é construído um sistema de teste automatizado. Infelizmente, quando os testes executados sem vigilância durante uma compilação noturno, o display está inativo ou amarrado com o screensaver, e nossa TI políticas de segurança não permitem desativar isso.

Assim, a minha pergunta: existe uma maneira de fazer uma captura de "tela" de um aplicativo que está sendo executado sem a exibição? Eu gostaria de garantir que a placa gráfica está envolvida para que meu pipeline de renderização é o mesmo, mas a estrutura de teste não precisa se preocupar com o estado da exibição.

Qualquer ajuda descontroladamente apreciada!

Foi útil?

Solução

Uma vez que você está mencionado rendering pipeline, então eu estou supondo que você está usando Direct3d, em caso afirmativo, você pode salvar o backbuffer do quadro. Eu fiz isso quando eu ainda estava usando VB.Net + MDX

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

Você pode facilmente convertida que fazer qualquer linguagem de programação de sua escolha, é basicamente chamando a API do Direct3d. Porém, você precisa configurar você parâmetros backbuffer e presente como

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

Outras dicas

Instale um VM e executar o aplicativo em que. Se você estiver executando uma proteção de tela duvido sua placa de vídeo é ainda gerar a GUI para a aplicação.

Se eu entendo correto, tudo que você quer para se tirar uma captura de tela de um aplicativo específico e não ter o resultado ser afetado por um screensaver possivelmente executando? Tanto quanto eu sei, simplesmente fazendo GetDIBits na HDC da janela correta deve fazer o truque e não se preocupam com o protetor de tela.

Você pode encontrar este código para ser muito lento, no entanto você pode obter um aumento de velocidade enorme, definindo o PresentParams.PresentFlag = PresentFlag.LockableBackBuffer

Além disso, você não precisa conjunto PresentInterval.One ou SwapEffect.Flip, eles podem ser deixados em .Default e .Discard repsectively.

(Note-se que esta aceleração não funciona se você estiver usando multisampling, certifique-se de que PresentParams.Multisample = Multisample.None. Se você tiver uma placa Nvidia você ainda pode obter antialiasing configurando a opção no painel de controle Nvidia para substituir a configuração aplicativo para o que você quer!)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top