2009-06-16 2 views
4

У меня есть несколько экземпляров одного и того же приложения. Пользователь может нажать «Завершить» на каждом экземпляре, чтобы закрыть его.События «межпроцессного взаимодействия .NET»

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

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

ответ

6

Послать 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); 
} 
2

Класс 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

+0

Спасибо. CloseMainWindow кажется хорошей альтернативой Win32. – xyz

Смежные вопросы