Eventos de .NET para el inicio ejecutable del proceso

¿Hay alguna manera de registrarse para un evento que se activa cuando se inicia un ejecutable de un nombre de archivo particular? Sé que es bastante fácil obtener un evento cuando sale un proceso, haciendo que el proceso se maneje y se registre para el evento salido. Pero, ¿cómo se le puede avisar cuando un proceso, que aún no se está ejecutando, comience … sin interrogar todos los procesos en ejecución?

Puede usar lo siguiente:

private ManagementEventWatcher WatchForProcessStart(string processName) { string queryString = "SELECT TargetInstance" + " FROM __InstanceCreationEvent " + "WITHIN 10 " + " WHERE TargetInstance ISA 'Win32_Process' " + " AND TargetInstance.Name = '" + processName + "'"; // The dot in the scope means use the current machine string scope = @"\\.\root\CIMV2"; // Create a watcher and listen for events ManagementEventWatcher watcher = new ManagementEventWatcher(scope, queryString); watcher.EventArrived += ProcessStarted; watcher.Start(); return watcher; } private ManagementEventWatcher WatchForProcessEnd(string processName) { string queryString = "SELECT TargetInstance" + " FROM __InstanceDeletionEvent " + "WITHIN 10 " + " WHERE TargetInstance ISA 'Win32_Process' " + " AND TargetInstance.Name = '" + processName + "'"; // The dot in the scope means use the current machine string scope = @"\\.\root\CIMV2"; // Create a watcher and listen for events ManagementEventWatcher watcher = new ManagementEventWatcher(scope, queryString); watcher.EventArrived += ProcessEnded; watcher.Start(); return watcher; } private void ProcessEnded(object sender, EventArrivedEventArgs e) { ManagementBaseObject targetInstance = (ManagementBaseObject) e.NewEvent.Properties["TargetInstance"].Value; string processName = targetInstance.Properties["Name"].Value.ToString(); Console.WriteLine(String.Format("{0} process ended", processName)); } private void ProcessStarted(object sender, EventArrivedEventArgs e) { ManagementBaseObject targetInstance = (ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value; string processName = targetInstance.Properties["Name"].Value.ToString(); Console.WriteLine(String.Format("{0} process started", processName)); } 

A continuación, podría llamar a WatchForProcessStart y / o WatchForProcessEnd pasando el nombre de su proceso (por ejemplo, “notepad.exe”).

El objeto ManagementEventWatcher se devuelve desde los dos métodos Watch * mientras implementa IDisposable, por lo que debe llamar a Dispose en estos objetos cuando haya terminado con ellos para evitar problemas.

También puede cambiar el valor de sondeo en las consultas si necesita que el evento se eleve más rápidamente después de que el proceso haya comenzado. Para hacer esto, cambie la línea “DENTRO DE 10” para estar dentro de algo menos de 10.

WMI puede crear eventos cuando se crean procesos. A continuación, puede filtrar estos eventos.

Aquí hay un código.

Tenga en cuenta que debe iniciar Visual Studio como administrador para ejecutar este código.

 using System; using System.Management; namespace AppLaunchDetector { class Program { static void Main(string[] args) { ManagementEventWatcher w = null; WqlEventQuery q; try { q = new WqlEventQuery(); q.EventClassName = "Win32_ProcessStartTrace"; w = new ManagementEventWatcher(q); w.EventArrived += new EventArrivedEventHandler(ProcessStartEventArrived); w.Start(); Console.ReadLine(); // block main thread for test purposes } catch (Exception ex) { } finally { w.Stop(); } } static void ProcessStartEventArrived(object sender, EventArrivedEventArgs e) { foreach (PropertyData pd in e.NewEvent.Properties) { Console.WriteLine("\n============================= ========="); Console.WriteLine("{0},{1},{2}", pd.Name, pd.Type, pd.Value); } } } }