2009-06-03 5 views
4

J'ai une application winform C# qui, au cours de son travail, ouvre un autre processus Winform. L'autre processus a son interface utilisateur. Lorsque je ferme l'application parente, je souhaite que l'autre application soit fermée automatiquement.Ferme un autre processus lorsque l'application est en cours de fermeture

Comment puis-je y parvenir?

Merci

+0

voir ce lien http: //stackoverflow.com/questions/169483/c-win32-notify-when-separate-window-is-closing-closed –

+0

Cela fait référence à une tâche similaire, mais opposée, (fermer l'application actuelle lorsqu'une autre fenêtre se ferme). L'article CodeProject lié ici devrait cependant être utile. – Noldorin

Répondre

4

Si vous utilisez Process.Process il y a la méthode CloseMainWindow. Si vous conservez une référence à l'objet, vous pouvez l'utiliser plus tard.

est ici la page dans le MSDN

et le code correspondant:

// Close process by sending a close message to its main window. 
myProcess.CloseMainWindow(); 
// Free resources associated with process. 
myProcess.Close(); 
+0

Je ne peux pas voir la raison de baisser celui-ci; c'est une solution parfaitement réalisable (même si j'ajouterais un appel à CloseMainWindow avant d'appeler la méthode Close). –

+0

Down-voté pour la même raison que la réponse de Shoban. Ce n'est pas la bonne façon de fermer un processus. – Noldorin

+0

OK, donc j'ai eu la mauvaise méthode pour commencer, mais vraiment lire la page MSDN a donné le bon - que je suis sûr que l'OP est capable de faire – ChrisF

1

La façon la plus gracieuse de le faire est probablement d'envoyer un message de fenêtre principale à partir de l'autre processus. Vous pouvez obtenir le handle de cette forme principale en utilisant simplement la propriété Process.MainWindow.Handle (je suppose que vous utilisez la classe Process, puis utilisez simplement l'appel PostMessage Win API pour envoyer un message avec un ID personnalisé à la fenêtre principale de cet "enfant" Ensuite, la boucle de message de l'autre processus peut facilement détecter ce message (en surchargeant la méthode) et effectuer un arrêt approprié en conséquence.Une alternative serait d'envoyer la méthode standard WM_CLOSE, ce qui signifierait que vous auriez juste à décharger l'application du gestionnaire de l'événement Form.Closed, mais peut vous permettre peut-être moins de contrôle (sur l'annulation de la fermeture dans certaines situations)

3

Il existe plusieurs options différentes. la processus qu'il commence:

private Stack<Process> _startedProcesses = new Stack<Process>(); 
private void StartChildProcess(string fileName) 
{ 
    Process newProcess = new Process(); 
    newProcess.StartInfo = new ProcessStartInfo(fileName); ; 
    newProcess.Start();  
    _startedProcesses.Push(newProcess); 
} 

Lorsque l'application se ferme, vous pouvez appeler une méthode qui fermera tout a commencé des processus enfants qui sont encore en cours d'exécution. Vous pouvez utiliser ceci avec la méthode Kill ou en appelant les méthodes CloseMainWindow et Close. CloseMainWindow/Close effectuera un gros plus gracieux (si vous commencez le Bloc-notes et il y a des modifications non enregistrées, tuer les perdra, CloseMainWindow/Close fera demander le bloc-notes si vous souhaitez enregistrer):

private void CloseStartedProcesses() 
{ 
    while (_startedProcesses.Count > 0) 
    { 
     Process process = _startedProcesses.Pop(); 
     if (process != null && !process.HasExited) 
     { 
      process.CloseMainWindow(); 
      process.Close(); 
     } 
    } 
} 
Questions connexes