Вопрос № 35810: Уважаемые эксперты! Для предотвращения запуска второго экземпляра приложения использую If App.PrevInstance Then MsgBox"!":End в Private Sub Form_Load(), но что-то не работает!
..
Вопрос № 35.810
Уважаемые эксперты! Для предотвращения запуска второго экземпляра приложения использую If App.PrevInstance Then MsgBox"!":End в Private Sub Form_Load(), но что-то не работает!
If App.PrevInstance Then
MsgBox"!"
unload me
end if
--------- Открыть глаза навстречу солнцу
Ответ отправил: EPDSota (статус: Практикант)
Отправлен: 20.02.2006, 16:14 Оценка за ответ: 1 Комментарий оценки: ничего подобного
Отвечает: Залетин Виталий Викторович
Здравствуйте, Александр А.А.!
Предлагаю такой вариант:
Private Declare Function ShowWindow Lib "user32" _
(ByVal hwnd As Long, _
ByVal nCmdShow As Long) As Long
Private Declare Function FindWindow Lib "user32" _
Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Dim hWin as Long
hWin=FindWindow(vbnullstring,"Заголовок Вашего окна")
If CBool(hWin) then
MsgBox "!"
ShowWindow hWin,5 'Показываем окно уже запущенного приложения
End
End If
Можно еще в FindWindow задать первый параметр, а второй оставить пустым, но где гарантия, что в системе нет окна с таким именем класса?
Вот таким способом обнаружения уже запущенного приложения и предлагают пользоваться книги по программированию на VC. Честно говоря, я бы за это руки отрывал. Но как по-другому - по-моему, никак!
Хотя, вот появилась мысль использовать свойства окон: функции SetProp, GetProp, при загрузке ими забивать в какое-нибудь окно (лучше главное окно приложения) некоторое свойство. Все это примерно будет выглядеть так:
Declare Function GetProp Lib "user32" _
Alias "GetPropA" _
(ByVal hwnd As Long, _
ByVal lpString As String) As Long
Declare Function SetProp Lib "user32" _
Alias "SetPropA" _
(ByVal hwnd As Long, _
ByVal lpString As String, _
ByVal hData As Long) As Long
Sub Form_Load()
setprop me.hwnd, "$MainPropExec$",10 'Число от фонаря
End Sub
Потом перечислить все окна в системе и попробовать считать с него вот это установленное в Form_Load свойство. Если вернулось что-то больше ноля, то приложение наше уже запущено! Вот примерно так:
Declare Function EnumWindows Lib "user32" _
(ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Dim bYes as Boolean
Public Function EnumWProc(ByVal hwnd As Long, _
ByVal lpData As Long) As Long
if GetProp(hWnd,"$MainPropExec$")=10 Then
'Наше окно! Делаем что хотим!
bYes=True
EnumWProc=0 'Больше не перечислять!
Else
EnumWProc = 1
End If
End Function
Sub Main()
EnumWindows AddressOf EnumWProc,0
If bYes=True Then
'Окно найдено Делаем что хотим!
End If
End Sub
Вот все это, что я понаписал, придумал только-что. Не факт, что будет работать на 100%, но мысль, кажется правильна! Выйду с больничного, займусь отладкой!
--------- Учиться никогда не поздно. Особенно программированию!
Ответ отправил: Залетин Виталий Викторович (статус: Студент)
Отправлен: 25.02.2006, 13:35 Оценка за ответ: 5 Комментарий оценки: Спасибо