Как закрыть постороннее проиложение

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
altatr
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 06.05.2004 (Чт) 21:29

Как закрыть постороннее проиложение

Сообщение altatr » 06.05.2004 (Чт) 21:36

Подскажите пожалуйста есть ли способ из под Visual Basic закрыть внешнюю программу.
В постейшем случае должна быть прогамулина с двумя кнопками
первая кнопка будет стороннюю прогу запускать:

Private Sub Command1_Click()
Shell "C:\Instal\SAFlashPlayer.exe"
End Sub

А вторая будет эту самую прогу закрывать.
Поискал в сети, но нашел только какой то текстовик, без
исходника, он закрывает прогу как-то сначала найдя ее по заголовку...

Заранее спасибо!
Последний раз редактировалось altatr 28.12.2012 (Пт) 0:53, всего редактировалось 1 раз.

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 06.05.2004 (Чт) 22:43

Код: Выделить всё
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long

Dim PID As Long

Private Sub Command1_Click()
PID = Shell("C:\Instal\SAFlashPlayer.exe", vbNormalFocus)
End Sub

Private Sub Command2_Click()
TerminateProcess PID, 0
End Sub
Нет меня больше

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 06.05.2004 (Чт) 22:56

A.A.Z.
Редиска :)
Я как раз думал, чего это ShellExecute возращает, и почему это не хендл окна :oops:
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

altatr
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 06.05.2004 (Чт) 21:29

Сообщение altatr » 07.05.2004 (Пт) 18:06

На вторую кнопку реакции нет
(ошибок или сообщений тоже нет)
Последний раз редактировалось altatr 28.12.2012 (Пт) 0:57, всего редактировалось 1 раз.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.05.2004 (Сб) 6:27

Код: Выделить всё
Option Explicit

Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Dim hP As Long

Private Sub Command1_Click()
  hP = OpenProcess(0, 0, Shell("C:\windows\notepad.exe", vbNormalFocus))
End Sub

Private Sub Command2_Click()
  TerminateProcess hP, 0
  CloseHandle hP
End Sub


Мой предыдущий опыт подсказывает, что это не будет работать в NT :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 08.05.2004 (Сб) 23:05

PID - сокращенно "Process ID".
Его возвращает функция Shell.

2 FAKK2
Внизу пример, как из PID'а хендл верхнего окна получать. :)
Нет меня больше

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 08.05.2004 (Сб) 23:24

altatr, ты знаешь, чего-то не могу понять, в чем дело... Заюзал ExitProcess - VB вылетел... :shock: Не знаю... :oops:
Нет меня больше

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.05.2004 (Вт) 9:45

2 A.A.Z.
У меня большие сомнения, что Shell возвращает то, что надо.
В Win16 (VB3) он действительно возвращал hModule и по этому хэндлу затем можно было закрыть вызванное приложение. Но где-то я читал, что в Win32 использовать возвращаемые значения Shell невозможно, нужно юзать OpenProcess.

В NT-системах процессы закрывались, я как-то делал прогу, которая запускала игру (предварительно попатчив пару файликов :) ), вызов осуществлялся через OpenProcess. И при необходимости TerminateProcess отстреливал процесс и в Win9x и в NT-системах.
Lasciate ogni speranza, voi ch'entrate.

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 11.05.2004 (Вт) 17:43

Ох...
Нет меня больше

CyberYen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 112
Зарегистрирован: 10.03.2004 (Ср) 18:14

Сообщение CyberYen » 12.05.2004 (Ср) 19:27

Зачем обязательно закрывать процесс?? А почему нельзя программно нажать на [x] закрываемой проги :?:

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 12.05.2004 (Ср) 19:36

CyberYen, я думаю, если бы все было так просто, человек бы не спрашивал.

altatr писал(а):он закрывает прогу как-то сначала найдя ее по заголовку...

Если известен заголовок, то
Код: Выделить всё
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_CLOSE As Long = &H10

Function CloseWindow(ByVal WindowCaption As String) As Boolean
Dim Wnd As Long, Ret As Long
Wnd = FindWindow(vbNullString, WindowCaption)
If Wnd = 0 Then CloseWindow = False: Exit Function
Ret = PostMessage(Wnd, WM_CLOSE, ByVal 0&, ByVal 0&)
If Ret = 0 Then CloseWindow = False: Exit Function
CloseWindow = True
End Function

Private Sub Form_Load()
MsgBox CloseWindow("Безымянный - Блокнот")
End Sub

Непонятно - спрашивай
Нет меня больше


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26

    TopList