Нужно задекларировать эти функции:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
И при запуске программы проверить:
If App.StartMode <> vbSModeStandalone Then
BlockLoad = True
Exit Sub
End If
If App.PrevInstance = True Then
Exit Sub
End If
' Is the main window already up?
OtherWnd = FindWindow(vbNullString, "Foreground Form ")
If OtherWnd <> 0 Then
' Make sure it's the same process - don't want
' to interfere with others
Call GetWindowThreadProcessId(OtherWnd, pid)
If pid = GetCurrentProcessId() Then
' Main window is up in the same process,
' so exit
Exit Sub
End If
End If
Amed писал(а):Добавлю ещё, что так блокируется запуск двух копий программы из одного exe-файла. Юзер может скопировать программу в другую папку и оттуда преспокойно запустить. Так что лучше сделать в программе какое-то поле с кодовым словом и при запуске второй копии искать это окно с этим словом среди запущенных окон. Осуществляется через API. Интересно? Тогда могу привести пример (может, кто-то сделает это за меня)
Сейчас этот форум просматривают: AhrefsBot и гости: 17