2012-06-26 4 views
1

У меня есть WinForms приложение,связи между экземплярами приложения

На Закрыть кнопку мыши, я прячусь, что приложение в системный трей, как и как скайп работает ..

Если приложение инстанциируется снова и если экземпляр этого приложения уже запущен, то я хочу запустить уже запущенное приложение (может быть в лотке) на передний план и выйти из нового.

Что я думаю о том, чтобы сделать что-то подобное в Main mathod с использованием WCF

Process currentProcess = Process.GetCurrentProcess(); 
Process[] processes = Process.GetProcesses(); 
bool running = false; 
foreach (var process in processes) 
{ 
    if (process.ProcessName == currentProcess.ProcessName 
     && process.Id != currentProcess.Id) 
    { 
     running = true; 
    } 
} 

if (running) 
{ 

    ChannelFactory<IService1> pipeFactory = new 
     ChannelFactory<IService1>(new NetNamedPipeBinding(), 
        new EndpointAddress("net.pipe://localhost/PipeActivate")); 

    IService1 pipeProxy = pipeFactory.CreateChannel(); 
    pipeProxy.ActivateThisWindow(); 

    Application.Exit(); 
} 
else 
{ 

    using (ServiceHost host = new 
     ServiceHost(typeof(Form1), 
       new Uri[] { new Uri("net.pipe://localhost") })) 
    { 

     host.AddServiceEndpoint(typeof(IService1), 
         new NetNamedPipeBinding(), "PipeActivate"); 

     host.Open(); 

     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 

     host.Close(); 
    } 
} 

где

void IService1.ActivateThisWindow() 
    { 
     this.Show(); 
     if (this.WindowState != FormWindowState.Normal) 
      this.WindowState = FormWindowState.Normal; 
     this.Activate(); 
    } 

теперь проблема, ее приведение запущенного экземпляра фронт, но как новые выходы, например, его собираются в прежнее состояние.

В чем проблема? Как я могу это решить?

Какие другие способы я могу использовать для достижения этого требования?

+0

Почему вы пытаетесь иметь дело с несколькими экземплярами. Процесс Skype не заканчивается, когда он отправляется на системную панель. –

+0

Я также не заканчиваю при отправке в системную панель .. – dotNETbeginner

ответ

2

Хотя это очень новый подход, это своего рода перебор. Существует более простой и широко используемый способ решения этой проблемы, как здесь видно.

What is the correct way to create a single-instance application?

Говоря из личного опыта, я использовал этот ресурс для всех моих отдельных приложений, например, и он работает как шарм.

1

Я предполагаю, что вы внедрили IService1.ActivateThisWindow в классе Form 1, поэтому это поведение объясняется тем, что новый экземпляр формы1 создается для каждого запроса в главном приложении и уничтожается, когда запрос заканчивается. Чтобы решить проблемный фактор из IService1.ActivateThisWindow в отдельном классе, поэтому form1 не является объектом-хозяином и делает form1 singleton.

+0

здесь, в уже запущенном процессе, новый экземпляр формы1 создается, когда вы отправляете запрос из нового процесса. Это связано с тем, что в wcf создается новый экземпляр объекта-хозяина на запрос/сеанс. Вы можете проверить это, выполнив идентификатор процесса в constuctor формы1 –

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