3 / 4 / 0
Регистрация: 16.01.2013
Сообщений: 248

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

28.08.2013, 18:23. Показов 1755. Ответов 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
38178 / 21113 / 4307
Регистрация: 12.02.2012
Сообщений: 34,716
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru