Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
3 / 4 / 0
Регистрация: 16.01.2013
Сообщений: 248

Как запретить запускать программу?

28.08.2013, 18:23. Показов 1791. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть программа которая запускает другую программу, но вот только эту другую программу можно запускать много раз подряд. Как сделать так чтобы выполнялось условие: Если программа с именем X запущена то Command1.Enabled = False.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.08.2013, 18:23
Ответы с готовыми решениями:

Как запретить запускать несколько экземпляров одной проги?
Напомните, пожалуйста, как запретить запускать несколько экземпляров одной проги. (Например, как Word) Благодарю.

Как запускать программу с параметрами в коммандной строке?
Хочется, иметь возможность запускать программу с параметрами в коммандной строке. Например: с:MyProject.exe -myparameter Запустить...

Как запретить запускать программы ( браузер ) через метро?
Как запретить запускать программы ( браузер ) через метро? если точнее то браузер Google chrome. Все нормально открывался уже месяц и вот...

9
238 / 49 / 6
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1
28.08.2013, 21:18
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Const GW_HWNDFIRST = 0
Const GW_HWNDNEXT = 2
Const WM_CLOSE = &H10
Const WM_QUIT = &H12
Dim CurrWnd As String
Dim ListItem As String
Dim Length As String
 
Sub GetTaskList()
CurrWnd = GetWindow(Me.hwnd, GW_HWNDFIRST)
Do While CurrWnd <> 0
Length = GetWindowTextLength(CurrWnd)
ListItem = Space(Length + 1)
Length = GetWindowText(CurrWnd, ListItem, Length + 1)
If Length <> 0 Then
List1.AddItem ListItem
End If
CurrWnd = GetWindow(CurrWnd, GW_HWNDNEXT)
DoEvents
Loop
End Sub
 
Private Sub Command1_Click()
List1.Clear
GetTaskList
End Sub
 
Private Sub Command2_Click()
hW = FindWindow(vbNullString, List1.Text & Chr(0))
PostMessage hW, WM_QUIT, 0, 0
End Sub
 
Private Sub Form_Load()
Left = (Screen.Width - Width) \ 2
Top = (Screen.Height - Height) \ 2
GetTaskList
Command1.Caption = "получить список"
Command2.Caption = "Закрыть приложение"
End Sub
Вот такой код я нашёл на просторах интернета, он формирует список запущенных процессов. Используя этот код, выполняйте поиск нужного приложения по списку, и если его найдете, то Command1.Enabled = False
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,741
Записей в блоге: 14
29.08.2013, 10:47
Загляни сюда
1
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
29.08.2013, 22:58
MorfixProton, если ориентироваться только на имя приложения, то нет ничего проще, чем использование свойства PrevInstance объекта App:
Visual Basic
1
2
3
4
5
6
7
Sub Main()
If App.PrevInstance Then
    MsgBox "Экземпляр приложения уже запущен.", vbExclamation
Else
    MsgBox "Приложение запущено в единственном экземпляре.", vbInformation
End If
End Sub
Добавлено через 1 час 46 минут
Впрочем, если необходимо ограничивать количество запускаемых экземпляров средствами не запускаемого приложения, а - запускающего, то можно поступить, например, так:
Visual Basic
1
2
3
4
5
6
7
8
9
Private Sub Form_Load()
Dim objWMI As Object, objCollection As Object
Const strApp As String = "anyapp.exe"
Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
Set objCollection = objWMI.ExecQuery("SELECT * FROM Win32_Process WHERE Name='" & strApp & "'")
If objCollection.Count > 0 Then Me.Command1.Enabled = False
Set objCollection = Nothing
Set objWMI = Nothing
End Sub
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
30.08.2013, 02:56
Dmitrii, а если приложений с таким именем несколько?

Надежней через ProcessID. На сколько понимаю, эта же программа и запускает, и проверяет,
тогда можно создать процесс через метод Create класса Win32_Process, либо Shell нам его вернет.

Интересно, на сколько корректен оправдан такой синтаксис:

Visual Basic
1
2
3
4
5
6
7
Sub Form_Load()
    Dim PID&
    PID = Shell("calc.exe") 'Запустим калькулятор
    On Error Resume Next
    GetObject "WinMgmts:\\.\Root\CIMV2:Win32_Process.Handle=" & PID
    Command1.Enabled = Err <> 0
End Sub
1
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
30.08.2013, 21:41
Цитата Сообщение от Dragokas Посмотреть сообщение
а если приложений с таким именем несколько?..
Так ведь требуется лишь запретить запуск дубликата. Для решения задачи в том виде, в каком её описал автор, знать дескриптор уже запущенного процесса не нужно.
Дескриптор не потребуется и в том случае, когда есть разные по сути приложения, имеющие одинаковые имена, т.к. он не позволит отличить их друг от друга. Здесь уже нужно знать хэши.

Цитата Сообщение от Dragokas Посмотреть сообщение
... на сколько оправдан такой синтаксис
В контексте обсуждаемой задачи совершенно не оправдан, т.к. состояния ошибки не возникнет независимо от того, будет ли найден специфицированный экземпляр класса или нет. Убедитесь сами:
Visual Basic
1
2
3
Private Sub Form_Load()
MsgBox IsError(GetObject("WinMgmts:\\.\Root\CIMV2:Win32_Process.Handle=" & PID))
End Sub
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
30.08.2013, 22:35
Исходя из задачи, я представил, что считаю у себя калькуляторе, и тут автор решил запустить у меня программу, которая называется тоже калькулятор =))
Цитата Сообщение от Dmitrii Посмотреть сообщение
Убедитесь сами:
Не, так не получится проверить. Исключение будет выброшено раньше - это Automation Error.
0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
30.08.2013, 23:10
Цитата Сообщение от Dragokas Посмотреть сообщение
я представил, что считаю у себя калькуляторе, и тут автор решил запустить у меня программу, которая называется тоже калькулятор
Я тоже представил себе такую ситуацию. Как уже сказано, знание дескриптора уже запущенного процесса калькулятора не поможет отличить его от приложения с аналогичным названием, но иной функциональностью.
Цитата Сообщение от Dragokas Посмотреть сообщение
... Исключение будет выброшено раньше...
Верно. Не хватает оператора описания переменной:
Visual Basic
1
2
3
4
Private Sub Form_Load()
Dim PID&
MsgBox IsError(GetObject("WinMgmts:\\.\Root\CIMV2:Win32_Process.Handle=" & PID))
End Sub
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
31.08.2013, 00:47
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Цитата Сообщение от Dmitrii Посмотреть сообщение
Я тоже представил себе такую ситуацию. Как уже сказано, знание дескриптора уже запущенного процесса калькулятора не поможет отличить его от приложения с аналогичным названием, но иной функциональностью.
Вы правы. Но это был только пример, на основе которого можно построить логику проверки вида "Не запускать еще один экземпляр, пока идентификатор только что запущенного процесса все еще существует".

Visual Basic
1
2
3
4
5
6
7
Dim PID&
 
Sub Command1_Click()
    On Error Resume Next
    GetObject "WinMgmts:\\.\Root\CIMV2:Win32_Process.Handle=" & PID
    If PID = 0 Or Err <> 0 Then PID = Shell("calc.exe")
End Sub
Цитата Сообщение от Dmitrii Посмотреть сообщение
В контексте обсуждаемой задачи совершенно не оправдан, т.к. состояния ошибки не возникнет независимо от того, будет ли найден специфицированный экземпляр класса или нет. Убедитесь сами:
Не возникает, потому что в Вашем примере тип Long инициализируется нулем.
По-умолчанию в системе процессом с ID=0 является System Idle Process.

Добавлено через 30 минут

Не по теме:

Всегда интересовало, почему MS обозвало свойство, возвращающее Process ID, - Handle (ибо дескриптор процесса - это совершенного другое).
В классе Win32_Process есть и .ProcessId, но почему оно вызывает ошибку в используемом мною варианте конструкции?
Единственное видимое различие - это типы данных: string для Handle и uint32 для ProcessId.

0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
31.08.2013, 01:20
Цитата Сообщение от Dragokas Посмотреть сообщение
По-умолчанию в системе процессом с ID=0 является System Idle Process.
Верно. Я о нём совсем забыл.
Цитата Сообщение от Dragokas Посмотреть сообщение
... Не запускать еще один экземпляр, пока идентификатор только что запущенного процесса все еще существует...
Теперь понятно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.08.2013, 01:20
Помогаю со студенческими работами здесь

Как запретить пользователю с обычным доступом запускать диспечер задач
Подскажите как запретить пользователю с обычным доступом запускать диспечер задач. Желательно, что б можно было находясь под этим...

Как циклически запускать программу?
Наверняка, решается тривиально. Нужно, чтобы программа автоматически запускалась через определенные промежутки времени. Скажем, каждые 15...

Как запускать программу в развернутом окне?
Ну могу решить простейшую проблему: Как запускать приложение в развернутом виде??? То есть, не в полноэкранном и не методами вычисления...

Как запускать Qt программу в нужное время?
Написал простенькое Qt-приложение для фана. Включил его в автозагрузку. Как мне сделать так, чтобы оно не сразу запускалось при...

Как запускать программу в скрытом режиме?
Вообщем такая ситуация - есть одна программа, которую я хочу запустить у себя на работе в скрытом режиме. Программа должна быть невидима,в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru