Межпроцессные события .NET

У меня запущено несколько экземпляров одного и того же приложения. Пользователь может щелкнуть «Выход» в каждом экземпляре, чтобы закрыть его.

Я хотел бы добавить выбор «Выйти из всех экземпляров», который вызовет какое-то «событие», которое уведомляет все экземпляры приложения о том, что они должны быть закрыты. Мне не нужно передавать какие-либо данные вместе с этим событием.

Каков наилучший (и желательно самый простой) способ сделать это в Windows с помощью С#/.NET?


person xyz    schedule 16.06.2009    source источник


Ответы (2)


Отправьте старое доброе 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);
}
person Otávio Décio    schedule 16.06.2009

Класс 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-us/library/system.diagnostics.process.close.aspx

person kirkus    schedule 16.06.2009
comment
Спасибо. CloseMainWindow кажется хорошей альтернативой Win32. - person xyz; 17.06.2009