Как запретить multiple instaces?

Ролг Хупин

Сделал так, как здесь описано:
static void Main() 
 { 
 bool first = false; 
 m = new Mutex(true, Application.ProductName.ToString(), out first); 
 if ((first)) 
 { 
 Application.EnableVisualStyles(); 
 Application.SetCompatibleTextRenderingDefault(false); 
 Application.Run(new Form1()); 
 m.ReleaseMutex(); 
 } 
 else 
 { 
 MessageBox.Show("Application" + " " + Application.ProductName.ToString() + " " +"already running"); 
 } 
 }
Но хотелось бы такого: брингнуть существующее активное приложение перед выходом из второго, после обнаружения, что уже есть активное.Как такое сделать?
5 ответов

Ролг Хупин

Ролг Хупин,Win api. Поиск окна по имени класса или подписи и потом MESSAGE ему.Но может права понадобятся.Вообще, у вас они оба не работают совместно или юзвери дважды кликают?))


Ролг Хупин

Ролг Хупин,Win api. Поиск окна по имени класса или подписи и потом MESSAGE ему.Но может права понадобятся.Вообще, у вас они оба не работают совместно или юзвери дважды кликают?))
работают, просто два одновременно не нужны, всё из-за дурного юзера


Ролг Хупин

всё из-за дурного юзера
)))))Бывает).Поставь ему стиль Всегда наверху).


Ролг Хупин

Ролг Хупин,я обычно такую стандартную для себя конструкцию использую:
Sub Main()
 Dim hwndTarget As IntPtr 'hwnd окна PrevInstance

 If InStr(Command, "/quit") > 0 Then 'закрывает myapp и выходит
 Dim Start_Time As Date
 Do
 hwndTarget = FindMyWindow(0) 'WINDOWTITLE_MYAPP
 If hwndTarget = IntPtr.Zero Then Exit Do
 PostMessage(hwndTarget, WS_CANCELMODE, 0, IntPtr.Zero)
 PostMessage(hwndTarget, WM_CLOSE, 0, IntPtr.Zero)
 Application.DoEvents()
 Start_Time = Now()
 Do
 Application.DoEvents()
 If IsWindow(hwndTarget) = IntPtr.Zero Then Exit Do
 If DateDiff("s", Start_Time, Now) > 10 Then
 Exit Sub
 End If
 Loop
 Loop
 Exit Sub
 End If

 'исключить запуск второго экземпляра приложения
 hwndTarget = FindMyWindow(0) 'WINDOWTITLE_MYAPP
 If hwndTarget <> IntPtr.Zero Then
 If IsIconic(hwndTarget) Then ShowWindow(hwndTarget, SW_RESTORE)
 SetForegroundWindow(hwndTarget)
 Exit Sub
 End If
 'все таки этот вариант надо отработать, т.к. есть шанс быстро щелкнуть 2 раза по иконке(до загрузки формы)
 If PrevInstance() Then Exit Sub

 Application.EnableVisualStyles() 'инициализация XP/Vista стиля

...

 Form1 = New frm1
 Application.Run(Form1)
 End Sub

 Public Function PrevInstance() As Boolean
 If Ubound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName)) > 0 Then
 Return True
 Else
 Return False
 End If
 End Function
FindMyWindow(0) -ищет главную форму Form1 запущенного уже экземпляра(1) по тексту в шапке перебор EnumWindows(2) + я еще размещаю на форме visible=false child-контрол (обычно button), с хитрым .text (например "qwertyuio" -случайно не придумаешь), т.е. проверяется еще наличие этой абракадабры -через FindWindowExВ последнее время (1) не использую, ищу сразу (2), т.к. в случае локализации (многоязычности) шапки будут разные,а скрытый контрол от "перевода" не зависит.Если надо, код своего FindMyWindow(i) в принципе могу дать в аккуратном виде.


Ролг Хупин

Ролг Хупин,читайте соседние темы: 21192718Для винформс то, что по ссылке, вполне адаптируемо.