Еще один довольно простой способ сделать это - использовать событие Windows, представленное в .NET как класс System.Threading.EventWaitHandle
.
Создать поток в приложении, все, что он делает, это ожидает именованного события,Когда событие сигнализируется, этот поток будет использовать Form.BeginInvoke
, чтобы появилось главное окно, и вернется к ожиданию события.
Из нового экземпляра приложения вам нужно будет только сигнализироватьevent.
Это требует немного меньше работы, чем использование каналов.
Обратите внимание, что в любом случае (с использованием каналов, окон или событий) вам всегда приходится иметь дело с разрешениями.
Например, если UAC включен, а существующий экземпляр приложения запущен с правами администратора, новый экземпляр не сможет отправить ему сообщение, чтобы показать окно, если вы не уверены, что установили правильные разрешения (например, натруба или событие, каким бы ни был ваш метод) заранее.