.NET inter-process & # 8220; events & # 8221;
Вопрос
У меня запущено несколько экземпляров одного и того же приложения. Пользователь может нажать кнопку «Выйти». на каждом экземпляре, чтобы закрыть его.
Я бы хотел добавить вариант "Quit All Instances", который вызовет у ребенка "событие" quot; это уведомляет все экземпляры приложения о том, что они должны закрыться. Мне не нужно переносить какие-либо данные вместе с этим событием.
Какой лучший (и желательно самый простой) способ сделать это в Windows с использованием C # /. NET?
Решение
Отправьте good'ol WM_CLOSE всем экземплярам ...
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);
}
Другие советы
Класс System.Diagnostics.Process имеет несколько методов, которые вы можете использовать.
Process.GetProcessesByName позволит вам перечислить все экземпляры:
http://msdn.microsoft.com /en-us/library/system.diagnostics.process.getprocessesbyname.aspx р>
затем Process.CloseMainWindow или Process.Close закроют их:
http://msdn.microsoft.com /en-us/library/system.diagnostics.process.closemainwindow.aspx http://msdn.microsoft.com/en- нас / библиотека / system.diagnostics.process.close.aspx