15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Как предотвратить запуск нескольких копий приложения

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

При по шагам

  1. Создайте новый проект Visual Basic.

  2. Идите в Project Properties и установите Startup Object (или Startup Form в VB4) в Sub Main.

  3. Добавьте в проект стандартный модуль.

  4. Поместите в модуль следующий код:
          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
     



  5. Компилируем проект в EXE.

  6. Выходим из Visual Basic.

  7. Запускаем экзешник, который Вы создали.

  8. Повторяем шаг 7.

    РЕЗУЛЬТАТ: Первый экземпляр программы получает фокус, а второй закрывается. Если первый экземпляр приложения в это время минимизирован, то он будет автоматически восстановлен в нормальное окно.