Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Разрешить запуск только одной программы Добавлено: 10.12.06 15:02  

Автор вопроса:  Rascal | Web-сайт: uzplat.org
Помогите написать процедурку, в качестве параметра ей передаётся путь к файлу.
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-сайт: uzplat.org
 Профиль | | #2
Добавлено: 10.12.06 17:04
Да, ярлык указывает на exe

Ответить

Номер ответа: 3
Автор ответа:
 night-roll



Вопросов: 36
Ответов: 326
 Профиль | | #3 Добавлено: 10.12.06 19:23
а почему просто не запретить запуск второго экземпляра проги?!

Ответить

Номер ответа: 4
Автор ответа:
 Rascal



Вопросов: 9
Ответов: 37
 Web-сайт: uzplat.org
 Профиль | | #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-сайт: uzplat.org
 Профиль | | #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)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам