Pergunta

Eu quero mostrar alguns gráficos personalizados no topo de uma festa de 3 fullscreen aplicativo do Windows.

Você já jogou nada a vapor? Ele tem um executável, GameOverlayUI.exe que permite acessar janelas vapor de dentro de um jogo. (Os elementos GUI aparência personalizada desenhado, eu não sei se isso é uma necessidade, mas eles parecem exatamente o mesmo dentro de um jogo como o fazem na área de trabalho.) Ela ainda vai tão longe para 'dim' os gráficos do jogo em fundo.

Eu estou querendo saber como se poderia ir sobre a escrita de tal pedido.

Eu também estou querendo saber como ampliar o âmbito das soluções seria. você poderia usar um método para todos os aplicativos OpenGL? Para todos os aplicativos Direct3D menos DirectDraw? Para todas as aplicações Windows em tela inteira?

Eu estou procurando soluções mais 'modernas' e genéricos -. Sobrepondo um prompt de comando ou um aplicativo cores indexadas 320x240 não é uma preocupação

Edit: Alguns esclarecimentos: O aplicativo de tela cheia não é meu. Pode ser qualquer coisa. Muito provavelmente, será um jogo 3D. Eu quero mostrar, digamos, um relógio digital no canto inferior direito da tela, em cima dos gráficos do jogo. Eu gostaria de evitar truques como injetar código ou depurar o processo, se possível.

Foi útil?

Solução

Bem, aqui está outro exemplo. Xfire é um programa de bate-papo que sobrepõe sua interface em jogos para que possa receber mensagens durante o jogo. A forma de fazer isso é através da edição do D3D / OpenGL DLL no nível de memória do processo, como uma injeção de montagem saltos. Eu sei disso porque seu método estava causando a minha mod de acidente, e eu realmente vi o código de montagem estranha eles estavam injetando na d3d9.dll.

Então aqui está como Xfire faz isso:

  1. alvo o processo do jogo
  2. procurar sua memória processo para d3d.dll / OpenGL.dll
  3. injetar no processo um DLL que contém a lógica de interface personalizada
  4. funções da interface de conexão para o fluxo do programa escrevendo manualmente montagem salta no D3D / funções OpenGL encontrada na memória do processo

Não há nenhuma outra maneira concebível, pois você precisa seqüestrar o dispositivo gráfico que pertence a esse jogo. Eu estou disposto a apostar que o Steam faz isso da mesma forma que Xfire. Então, sim, nenhuma maneira fácil de fazer isso a menos que alguém criou uma biblioteca útil para fazer tudo o que você precisa fazer ao nível baixo.

Você também perguntou sobre escurecendo os gráficos do jogo sob seu sobreposição. Esta é apenas uma chamada DrawPrimitive simples para desenhar um retângulo transparente cheio sobre a tela.

Outras dicas

Criado um Gist com código completo aqui

Esta é uma arte muito esotérico, e há várias maneiras de fazer isso. Eu prefiro que é chamado de Direct3D Wrapper . Tem sido anos desde que eu fiz isso, mas eu fiz isso com um jogo uma vez. Eu possa ter deixado de fora alguns detalhes, mas eu só espero que para ilustrar a idéia.

Jogos Todos Direct3D9 precisa chamar IDirect3DDevice9 :: EndScene após a tela é processado e pronto para ser desenhado. Portanto, em teoria, podemos colocar código personalizado dentro EndScene que atrai o que queremos ao longo do jogo. Fazemos isso através da criação de uma classe que se parece com IDirect3DDevice9 para o jogo, mas é realmente apenas um invólucro que encaminha todas as chamadas de função para a classe real. Então, agora, em nossa classe personalizada, a nossa função de invólucro para olhares EndScene assim:

HRESULT IDirect3DDevice9::EndScene()
{
   // draw overlays here

   realDevice.EndScene();
}

Em seguida, compilá-lo em uma DLL chamada d3d9.dll, e soltá-lo no diretório do executável do jogo. O verdadeiro d3d9.dll deve estar na pasta / system32, mas o primeiro jogo Looks no diretório atual e, em vez carrega o nosso. Uma vez que o jogo carrega, ele usa a nossa DLL para criar uma instância de nossa classe wrapper. E agora cada EndScene tempo é chamado, o nosso código é executado para desenhar o que queremos para a tela.

Eu acho que você pode tentar o mesmo princípio com OpenGL. Mas para evitar adulterações, acho que alguns jogos modernos tentam evitar isso.

therers um software gratuito projetar seu nome é taksi texto do link . eu não sou certo como esta aplicação substituir o processo porque eu sou ser examinar o código ainda, mas checkit eu acho que este é um projeto bom

Eu estive pensando sobre isso. Para OpenGL, eu ligar SwapBuffers de WGL com Detours, desenho minhas coisas depois do jogo e, em seguida, trocando buffers mim mesmo.

Eu fiz sobreposições com ambas as viewports DirectX & WPF (mesma coisa, na verdade), usando a sobreposição de pintar algumas agradáveis ??2D GDI + coisas em cima de visualizações 3D.

Eu consegui usando um painel no topo da visualização "actual", definindo a cor para transparente, exceto para os bits que eu queria sobreposta. Funcionou muito bem, mas foi um pouco de dor passando clicar, arrastar, e outros eventos através da camada de "desenho" para o controle 3D.

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