2011-02-05 13 views
11

Hola, ¿Hay una manera de aumentar evento cuando un nuevo proceso se pone en marcha sin utilizar el ManagementEventWatcher, y sin utilizar los Process.GetProcesses()? El problema con ManagementEventWatcher es que el usuario necesita tener altas premisas. ¡Gracias!C# provocar un evento cuando un nuevo proceso comienza

+3

En lugar de intentar eludir el modelo de seguridad, ¿qué le parece decirnos qué problema está tratando de resolver en realidad? Puede haber un mejor enfoque general que no haya pensado. –

+0

Estoy creando un juego (Treasure Hunt) que usa ventanas para el patio de recreo, así que cuando abro un nuevo bloc de notas o calco le enviaré pistas sobre el proceso ... así que tengo que plantear el evento cuando comience el siguiente proceso para que pueda envía los consejos para el tesoro ... espero que lo obtengas ... – user604627

+0

¿Has probado 'ManagementEventWatcher'? No veo nada en los documentos que diga que necesita grandes permisos, aunque admitiré que no lo he probado en una cuenta de usuario muy restringida. –

Respuesta

9

A diferencia del evento extrínseco Win32_ProcessStartTrace que está utilizando actualmente, los eventos intrínsecos WMI __InstanceCreationEvent y __InstanceDeletionEvent no requieren derechos de administrador.

Aquí hay una consulta de ejemplo que puede utilizar para realizar un seguimiento de proceso se inicia:

SELECT TargetInstance 
    FROM __InstanceCreationEvent WITHIN 1 
WHERE TargetInstance ISA 'Win32_Process' 
    AND TargetInstance.Name LIKE '<your process name.exe>' 

Más información: Process Information and Notifications using WMI

Debido a que estos son eventos intrínsecos, WMI en última instancia imita evento de comportamiento por medio de votación, y comprobará para nuevos eventos solo periódicamente (aquí, cada 1 segundo). Disminuir la duración de WITHIN a fracciones de segundos le dará una respuesta más rápida a expensas del uso de la CPU.

+5

Debe tener en cuenta que un intervalo de sondeo muy corto (por ejemplo, 0.1s) puede consumir hasta el 30% de la CPU que no está en su proceso, pero WmiPrvSE.exe que realiza el sondeo real. Por si acaso, si se pregunta por qué no su proceso está tomando de repente tanta CPU, pero un proceso del sistema. –

0

Lo extraño es una aplicación no necesita para crear una ventana en ventanas. El proceso de creación puede no pertenecer a la estación de ventana en la que trabajas. Necesitarás encontrar ventanas de ese proceso de todos modos, y también necesitarás detectar ventanas nuevas y cerradas de todos los procesos.

Por lo tanto, enumerar ventanas es una opción mucho más clara/fácil de usar.

Pruebe la función EnumChildWindows en el controlador de escritorio (obtenido por GetDesktopWindow) para encontrar las ventanas de aplicaciones de nivel superior. use GetWindowThreadProcessId y EnumThreadWindows en los identificadores obtenidos para detectar ventanas secundarias de ventanas.

Un hilo de baja prioridad hará el trabajo.

1

Debería ser posible averiguar cuando una aplicación se ejecutó por última mediante la configuración de seguimiento de proceso de auditoría en Windows. Los siguientes enlaces pueden empezar:

Audit process tracking

How can I track what programs come and go on my machine?

El seguimiento de procesos creará entradas en el registro de eventos de Windows que luego se puede acceder utilizando C#.

Ref: .NET Process Monitor

+0

Esto tiene sentido, y luego puedo suscribirme a las actualizaciones del registro de eventos sin tener que sondear ... http://msdn.microsoft.com/en-us/library/bb671202(v=vs.90).aspx. Creo que te recompensaré con la recompensa. – Satyajit

+2

Tenga en cuenta que la pregunta original fue de otro asker, por lo que no puedo marcar su respuesta como aceptada. – Satyajit

+0

¿No es esta una copia literal de http://stackoverflow.com/questions/1986249/c-sharp-process-monitor#answer-1986294? ¿Es normal obtener una recompensa por eso? ¿No debería la recompensa pertenecer a [0xA3] (http://stackoverflow.com/users/40347/0xa3) ?? –

0

Puede utilizar probablemente EnumDesktopWindows de user32.dll, recibirá todos los identificadores de ventana, se puede comprobar el título de la ventana usando GetWindowText, y el tipo de ventana utilizando GetClassName.

De esta manera puede ocultar la pista o el tesoro en cualquier lugar. (porque obtendrás manijas de todas las ventanas (y controles)).

Ver si esta clase será útil para usted Managed Global Hook for Window Creation and Destruction

En ese artículo, alguien ha creado buena clase con fácil de colocar eventos, puede ejecutar ese código sin elevar privilegios.

Una vez que obtenga el controlador de la ventana (control), puede agregar texto o dibujar una imagen para obtener sugerencias.

Cuestiones relacionadas