Страница: 1 |
Страница: 1 |
Вопрос: Разрешить запуск только одной программы
Добавлено: 10.12.06 15:02
Автор вопроса: Rascal | Web-сайт:
Помогите написать процедурку, в качестве параметра ей передаётся путь к файлу.
1. Если это первый запуск процедуры, то просто запускается указанный файл.
2. Если 2,3,4 и т.д. то сначала закрывается предыдущая программа, если она всё ещё запущенна, а потом запускается указанный файл.
Процедуре передаётся путь на ярлык к программе.
Вот мой набросок, тока он не работает
If lSuc > 0 Then
SendMessage lSuc, WM_CLOSE, 0, 0
SendMessage lSuc, WM_ENDSESSION, 0, 0
SendMessage lSuc, WM_QUERYENDSESSION, 0, 0
End If
lSuc = ShellExecute(Me.hwnd, "Open", Item.Path, 0&, 0&, 1)
Ответы
Всего ответов: 7
Номер ответа: 1
Автор ответа:
Fever
Вопросов: 60
Ответов: 808
Профиль | | #1
Добавлено: 10.12.06 16:09
EXE-шник?(важно)
Номер ответа: 2
Автор ответа:
Rascal
Вопросов: 9
Ответов: 37
Web-сайт:
Профиль | | #2
Добавлено: 10.12.06 17:04
Да, ярлык указывает на exe
Номер ответа: 3
Автор ответа:
night-roll
Вопросов: 36
Ответов: 326
Профиль | | #3
Добавлено: 10.12.06 19:23
а почему просто не запретить запуск второго экземпляра проги?!
Номер ответа: 4
Автор ответа:
Rascal
Вопросов: 9
Ответов: 37
Web-сайт:
Профиль | | #4
Добавлено: 11.12.06 07:23
Передаётся путь на разные программы. Нужно чтобы можно было запускать только одну любую программу. При запуске любой программы предыдущая (которая была запущенна процедурой) программа должна закрываться
Номер ответа: 5
Автор ответа:
JMP
Вопросов: 6
Ответов: 171
Профиль | | #5
Добавлено: 11.12.06 17:50
If lSuc > 0 Then
SendMessage lSuc, WM_CLOSE, 0, 0
SendMessage lSuc, WM_ENDSESSION, 0, 0
SendMessage lSuc, WM_QUERYENDSESSION, 0, 0
End If
lSuc = ShellExecute(Me.hwnd, "Open", Item.Path, 0&, 0&, 1)
Так не будет работать.
ShellExecute возвращает инстанцию запущеной проги.
а в SendMessage надо использовать handle главного окна запущеной проги.
Запускайте через ShellExecuteEx
в структуре SHELLEXECUTEINFO есть мембер hProcess
если прога запустилась то hProcess<>0 - это признак что уже что то запущенно
перед тем как запускать новую прогу проверять hProcess <>0 тогда
SendMessage(FindWindow("","ИмяГлавногоДиалогаЗапущенойПроги", WM_SYSCOMMAND,SC_CLOSE,0)
и потом ждать когда прога выгрузится
WaitForSingleObject(hProcess, infinite)
обнуляем hProcess и запускаем другую прогу
Номер ответа: 6
Автор ответа:
Rascal
Вопросов: 9
Ответов: 37
Web-сайт:
Профиль | | #6
Добавлено: 11.12.06 19:47
Да, но как мне узнать "ИмяГлавногоДиалогаЗапущенойПроги", проги то разные запускаются, и какие именно я не знаю.
Можно ли как нибудь закрыть прогу зная hProcess, или по нему найти "ИмяГлавногоДиалогаЗапущенойПроги". Но всё равно спасибо за подсказки
Номер ответа: 7
Автор ответа:
JMP
Вопросов: 6
Ответов: 171
Профиль | | #7
Добавлено: 11.12.06 22:26
Тогда так, енумеровать все окна, а потом
в цикле подставлять все хандлы всех в
GetWindowThreadProcessId
и сравнивать возвращенный ProcessId c запущеным
если совпадает, значит окно того процесса, который запустили. Есть конечно сложности, так как у процесса
может быть куча окон(текстбоксы, кнопки), можно
попробовать прошерстить все окна данного процесса
по классу, и если класс = диалогу слать ему SC_CLOSE
ну если не получится , тогда варварским методом
TerminateProcess(hProcess,0)