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

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

28.08.2013, 18:23. Показов 1751. Ответов 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
38174 / 21109 / 4307
Регистрация: 12.02.2012
Сообщений: 34,711
Записей в блоге: 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
18031 / 7734 / 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
18031 / 7734 / 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
18031 / 7734 / 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru