Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Basic / VBA


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Basic/VBA

Выпуск № 229
от 26.02.2006, 01:06

Администратор:Калашников О.А.
В рассылке:Подписчиков: 118, Экспертов: 22
В номере:Вопросов: 1, Ответов: 2


Вопрос № 35810: Уважаемые эксперты! Для предотвращения запуска второго экземпляра приложения использую If App.PrevInstance Then MsgBox"!":End в Private Sub Form_Load(), но что-то не работает! ..

Вопрос № 35.810
Уважаемые эксперты! Для предотвращения запуска второго экземпляра приложения использую If App.PrevInstance Then MsgBox"!":End в Private Sub Form_Load(), но что-то не работает!

Отправлен: 20.02.2006, 15:50
Вопрос задал: Александр А.А. (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: EPDSota
Здравствуйте, Александр А.А.!

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
Комментарий оценки:
Спасибо


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.14 (бета) от 09.02.2006
Яндекс Rambler's Top100

В избранное