La façon la plus simple est d'utiliser WMI. Surveillez spécifiquement Win32_ProcessStartTrace. Cela vaut mieux que Win32_Process, car il est configuré pour utiliser les événements alors que Win32_Process requiert une interrogation plus gourmande en ressources processeur. Voici comment le faire en C#. Assurez-vous d'abord que System.Management est configuré en tant que référence pour votre projet.
public System.Management.ManagementEventWatcher mgmtWtch;
public Form1()
{
InitializeComponent();
mgmtWtch = new System.Management.ManagementEventWatcher("Select * From Win32_ProcessStartTrace");
mgmtWtch.EventArrived += new System.Management.EventArrivedEventHandler(mgmtWtch_EventArrived);
mgmtWtch.Start();
}
void mgmtWtch_EventArrived(object sender, System.Management.EventArrivedEventArgs e)
{
MessageBox.Show((string)e.NewEvent["ProcessName"]);
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
mgmtWtch.Stop();
}
Le code va générer un à chaque fois messagebox vous lancez une nouvelle procédure. De là, vous pouvez vérifier une liste blanche/liste noire et agir de manière appropriée.
Malheureusement, WMI semble envoyer des notifications jusqu'à 5 secondes plus tard que le processus a été créé. Pas utile pour les notifications en temps réel ou faire quoi que ce soit avec des tâches de courte durée. –
J'ai trouvé un exemple sur le site Web de Microsoft pour la même tâche [ici] (http://msdn.microsoft.com/fr-fr/library/system.management.managementeventwatcher.waitfornextevent.aspx?cs-save-lang=1&cs- lang = csharp # code-snippet-1), mais il a le même problème. –
Gah ... l'utilisation de WMI est plus gourmande en ressources processeur que l'interrogation manuelle de la liste de processus (cela se produit simplement dans le processus de service WMI au lieu de votre processus). De plus, si votre application tombe en panne, l'abonnement continuera à fonctionner dans le service WMI, aspirant le CPU ... –