2010-11-07 6 views
3

salut Je veux "accrocher" une autre application de sorte que quand il se ferme, je peux fermer mon application.Regarder une autre application et si elle se ferme fermer mon application (sans interrogation) C#

Je ne veux pas interroger le processus en cours car cela semble inutilement intensif, si je veux répondre en temps réel.

Je crois que les applications envoient un message dans les fenêtres lorsqu'elles sont créées ou fermées, etc. Comment puis-je savoir quand il se ferme? Par exemple, disons que mon application charge les processus en cours de vérification pour s'assurer que le bloc-notes est chargé et, si c'est le cas, elle reste chargée jusqu'à ce que le bloc-notes soit fermé.

comme le bloc-notes est fermé mon application un peu comment sait cela et sort ...

est-ce possible si oui alors comment?

dont il a besoin de travailler sur vista xp et win7

Répondre

9

Si vous avez l'instance de processus pour l'application en cours d'exécution, vous pouvez utiliser Process.WaitForExit qui bloque jusqu'à ce que le processus est fermé. Bien sûr, vous pouvez mettre WaitForExit dans un autre thread afin que votre thread principal ne bloque pas.

Voici un exemple, ne pas utiliser un thread séparé

Process[] processes = Process.GetProcessesByName("notepad"); 
if (processes.Length > 0) 
{ 
    processes[0].WaitForExit(); 
} 

Voici une version simple à l'aide d'un fil pour surveiller le processus.

public static class ProcessMonitor 
{ 
    public static event EventHandler ProcessClosed; 

    public static void MonitorForExit(Process process) 
    { 
    Thread thread = new Thread(() => 
    { 
     process.WaitForExit(); 
     OnProcessClosed(EventArgs.Empty); 
    }); 
    thread.Start();  
    } 

    private static void OnProcessClosed(EventArgs e) 
    { 
    if (ProcessClosed != null) 
    { 
     ProcessClosed(null, e); 
    } 
    } 
} 

Le code de console suivant est un exemple de la façon dont ce qui précède peut être utilisé. Cela fonctionnerait aussi bien dans une application WPF ou WinForms bien sûr, MAIS n'oubliez pas que pour l'interface utilisateur, vous ne pouvez pas mettre à jour l'interface utilisateur directement à partir du rappel d'événement car il s'exécute dans un thread distinct du thread UI. Il y a beaucoup d'exemples ici sur stackoverflow expliquant comment mettre à jour l'interface utilisateur pour WinForms et WPF à partir d'un thread non-UI.

static void Main(string[] args) 
{ 
    // Wire up the event handler for the ProcessClosed event 
    ProcessMonitor.ProcessClosed += new EventHandler((s,e) => 
    { 
    Console.WriteLine("Process Closed"); 
    }); 

    Process[] processes = Process.GetProcessesByName("notepad"); 
    if (processes.Length > 0) 
    { 
    ProcessMonitor.MonitorForExit(processes[0]); 
    } 
    else 
    { 
    Console.WriteLine("Process not running");   
    } 
    Console.ReadKey(true); 
} 
+0

WaitForExit acier utilise le sondage –

+2

@SaeedAlg, WaitForExit appelle WaitOne sur le WaitHandle du processus, il s'agit d'une instance de ProcessWaitHandle. Donc, fondamentalement, utilise la fonctionnalité du système d'exploitation d'attendre que la poignée de processus soit signalée lorsque le processus est fermé. –

+0

Bonjour Chris merci pour cela, je suis nouveau sur C# et j'ai jusqu'ici évité d'utiliser plusieurs threads! suppose que je vais maintenant besoin de regarder cela ... une chance de la façon dont je le ferais sur un autre fil et soulever un événement ... – Adrian

1

Ceci est facilement possible parce que dans Window un handle de processus est attendu. Utilisez la classe Process pour obtenir le handle du processus.

Ensuite, utilisez cela pour construire un SafeHandle, créez un WaitHandle. Soit vous y attendez vous-même, soit vous enregistrez avec ThreadPool.RegisterWaitForSingleObject() pour recevoir un rappel lorsque le processus se ferme.

+0

c'est une bonne idée. Gardez à l'esprit que lorsque la classe dérivée de WaitHandle doit dupliquer le handle de processus, sinon les choses seront très peu fiables, cela nécessitera une méthode supplémentaire P/Invoke to kernel32 DuplicteHandle. –

Questions connexes