Как предотвратить запуск нескольких копий
приложения
В этой статье описывается, как предотвратить
загрузку второй копии приложения, если один
экземпляр приложения уже запущен. Так же
показывается как установить фокус на первую
копию приложения при попытке старта второй.
При по шагам
- Создайте новый проект Visual Basic.
- Идите в Project Properties и установите Startup Object (или Startup
Form в VB4) в Sub Main.
- Добавьте в проект стандартный модуль.
- Поместите в модуль следующий код:
Option Explicit
Public Const GW_HWNDPREV = 3
Declare Function OpenIcon Lib "user32" (ByVal hwnd As Long) As Long
Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) _
As Long
Declare Function GetWindow Lib "user32" _
(ByVal hwnd As Long, ByVal wCmd As Long) As Long
Declare Function SetForegroundWindow Lib "user32" _
(ByVal hwnd As Long) As Long
Private Sub Form_Load()
If App.PrevInstance Then
ActivatePrevInstance
End If
End Sub
Sub ActivatePrevInstance()
Dim OldTitle As String
Dim PrevHndl As Long
Dim result As Long
'Сохраняем заголовок приложения.
OldTitle = App.Title
'Переименовываем заголовок этого приложения, чтобы FindWindow
'не нашла этой копии приложения.
App.Title = "unwanted instance"
'Пытаемся получить дескриптор окна при помощи имени класса VB4.
PrevHndl = FindWindow("ThunderRTMain", OldTitle)
'Проверяем на успешность.
If PrevHndl = 0 Then
'Пытаемся получить дескриптор окна при помощи имени класса VB5.
PrevHndl = FindWindow("ThunderRT5Main", OldTitle)
End If
'Проверяем на успешность
If PrevHndl = 0 Then
'Пытаемся получить дескриптор окна при помощи имени класса VB6.
PrevHndl = FindWindow("ThunderRT6Main", OldTitle)
End If
'Проверяем на успешность
If PrevHndl = 0 Then
'Не найдено предыдущих экземпляров.
Exit Sub
End If
'Получаем дескриптор предыдущего окна.
PrevHndl = GetWindow(PrevHndl, GW_HWNDPREV)
'Восстанавливаем программу.
result = OpenIcon(PrevHndl)
'Активируем приложение.
result = SetForegroundWindow(PrevHndl)
'Конец приложения.
End
End Sub
- Компилируем проект в EXE.
- Выходим из Visual Basic.
- Запускаем экзешник, который Вы создали.
- Повторяем шаг 7.
РЕЗУЛЬТАТ: Первый экземпляр программы получает
фокус, а второй закрывается. Если первый
экземпляр приложения в это время минимизирован,
то он будет автоматически восстановлен в
нормальное окно.
|