2012-08-04 20 views
11

¿Es posible detectar qué aplicaciones usan OpenGL o DirectX de forma similar a lo que hace FRAPS? (Posiblemente usando alguna forma de gancho)? Probablemente no necesite dibujar en la ventana, solo necesito saber qué procesos están haciendo alguna forma de renderizado 3D por el momento.OpenGL/DirectX Hook - Similar a FRAPS

(Editar :) En caso de que no esté familiarizado con él, FRAPS es un programa que se puede utilizar para dibujar un contador "Cuadro por segundo" en una aplicación 3D. FRAPS encuentra todas las aplicaciones 3D en ejecución por sí mismo sin necesidad de que especifique el nombre del proceso.

Ejemplo de "fotogramas por segundo" contador dibujado a juego externa: enter image description here

+0

Supongo que la función que estás buscando yace escondida en las API de Windows de Microsoft. Buscaría allí la solución. – Oskar

+0

Puede echar un vistazo a http://taksi.sourceforge.net/. Es una alternativa de código abierto a FRAPS. Lo más importante es que podrías buscar en las fuentes y encontrar lo que necesitas. – JohnGray

+1

Tenga cuidado de que no todas las aplicaciones que usan DirectX/Direct3d estén realizando renderizaciones 3D. Usamos D3D para renderizar video H.264. – Deanna

Respuesta

8

Probablemente la forma más sencilla consiste en comprobar la presencia de las bibliotecas del núcleo de OpenGL y DirectX, probablemente también una buena idea para añadir en el el controlador OGL dlls también (como nvogl), esto se puede hacer a través de EnumProcesses & EnumProcessModulesEx, usando p/invoke, esto al menos le dará un conjunto inicial de procesos posiblemente usando OGL o DX.

Por supuesto, algunas aplicaciones cargan ambas API y usan solo una, o solo usan condicionalmente una de las API de GFX (aunque esta última solo ocurre con herramientas especializadas y similares), para esto, IMO, la mejor manera comprobar es realizar alguna forma de inyección o adjuntar al proceso como lo haría un depurador, luego conectar Present para DX o wglSwapBuffers para OGL.

Puede que esté a punto de salirse con la suya sin utilizar un gancho al enumerar los identificadores de GDI y buscar los contextos de representación DXGI u OGL, qué tan viable es esto, no lo sé.

+0

Desde MSDN: "Si se llama a esta función desde una aplicación de 32 bits que se ejecuta en WOW64, solo puede enumerar los módulos de un proceso de 32 bits. Si el proceso es de 64 bits, esta función falla y el último error el código es ERROR_PARTIAL_COPY (299). " Esto no estaba en la pregunta, pero necesito algo que funcione tanto en 32/64 bits. ¿Qué pasa si el proceso es de 64 bits? ¿Esto significa que si compilo la aplicación a 64 bits debería funcionar con 32/64? ¿O solo eso, si tienes 32 bits, no puedes enumerar aplicaciones de 64 bits? – David

+0

@David: hay una variante de 32 y 64 bits disponible ('EnumProcessModulesEx'), necesitarás una aplicación de 64 bits para obtener procesos de 32 y 64 bits (ver comentarios), y aún necesitarás una versión de 32 bits para Sistemas operativos de 32 bits. – Necrolis

6

Por lo que entiendo, FRAPS utiliza un enfoque de fuerza relativamente bruta para determinar dónde establecer el negocio. El proceso se inicia con SetWindowsHookEx para solicitar que el sistema operativo cargue el DLL de enlace FRAPS en cada proceso en ejecución que pueda [y procesos futuros]. La magia en el DLL se reduce a ejecutar un conjunto de pruebas de procedimientos usando GetModuleHandleA para observar si el proceso al que está conectado ha cargado cualquier módulo OpenGL/DirectX. Si todas las llamadas devuelven NULL, el gancho intenta eliminarse del proceso.

Por otro lado, si el proceso los ha cargado, simplemente engancha la función de representación apropiada de esa biblioteca quitando protección e inyectando un enganche JMP. wglSwapBuffers suele ser el único relevante en OpenGL. Cuando el proceso llama a esta función, termina llamando al módulo FRAPS y luego FRAPS captura el búfer posterior en su cola para codificar a AVI y muestra su pequeña indicación. Luego procesa la solicitud original de wglSwapBuffers y devuelve la ejecución al programa.

En cuanto a consultar en C# ... revise EasyHook (http://easyhook.codeplex.com/) y vea si no funciona para usted. Personalmente no tengo experiencia con esta API.