Événements & # 8220; inter-processus .NET & # 8221;
Question
J'ai plusieurs instances de la même application en cours d'exécution. L'utilisateur peut cliquer sur " Quitter " sur chaque instance pour l'éteindre.
Je voudrais ajouter le choix à "Quit All Instances", ce qui donnera lieu à un événement "événement". qui informe toutes les instances de l'application qu'elles doivent fermer. Je n'ai pas besoin de transporter de données avec cet événement.
Quel est le meilleur moyen (et de préférence le plus simple) de le faire sous Windows en utilisant C # /. NET?
La solution
Envoyez le good'ol WM_CLOSE à toutes les instances ...
Process[] processes = Process.GetProcesses();
string thisProcess = Process.GetCurrentProcess().MainModule.FileName;
string thisProcessName = Process.GetCurrentProcess().ProcessName;
foreach (Process process in processes)
{
// Compare process name, this will weed out most processes
if (thisProcessName.CompareTo(process.ProcessName) != 0) continue;
// Check the file name of the processes main module
if (thisProcess.CompareTo(process.MainModule.FileName) != 0) continue;
if (Process.GetCurrentProcess().Id == process.Id)
{
// We don't want to commit suicide
continue;
}
// Tell the other instance to die
Win32.SendMessage(process.MainWindowHandle, Win32.WM_CLOSE, 0, 0);
}
Autres conseils
La classe System.Diagnostics.Process comporte plusieurs méthodes que vous pouvez utiliser.
Process.GetProcessesByName vous permettra d’énumérer toutes les instances:
http://msdn.microsoft.com /en-us/library/system.diagnostics.process.getprocessesbyname.aspx
puis Process.CloseMainWindow ou Process.Close les arrêtera:
http://msdn.microsoft.com /en-us/library/system.diagnostics.process.closemainwindow.aspx http://msdn.microsoft.com/fr us / library / system.diagnostics.process.close.aspx