Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Завершить чужой процесс


Автор: bel_nikita 10.5.2008, 23:28
Хотелось бы корректно завершить чужой процесс. Как это правильно реализовать?

З.Ы.: Terminate(0) не предлагать

Автор: Rrader 11.5.2008, 13:27
Можно попробовать послать главному потоку WM_QUIT

Автор: W4FhLF 11.5.2008, 14:50
Цитата(Rrader @  11.5.2008,  13:27 Найти цитируемый пост)
Можно попробовать послать главному потоку WM_QUIT


Добавлю, что в случае, если приложение не обрабатывает это сообщение или вообще не имеет окна, то корректного универсального способа завершить его не существует. 

Автор: Akina 11.5.2008, 17:07
Цитата(bel_nikita @  11.5.2008,  00:28 Найти цитируемый пост)
Terminate(0) не предлагать 

Ставя условие, неплохо бы его обосновать.

Автор: bel_nikita 12.5.2008, 11:35
Terminate(0) - это крайний случай, если не получиться корректное завершение.
Возьмем, например, FireFox. Если мы выходим из программы путем File->Exit или нажатием Close - зарешение корректное, происходит закрытие всех окон и т.д. Но если мы "убъем" процесс в TaskManager'е, то это уже не будет корректным завершением.
Предполагаю, что процессу, точнее главному треду, нужно послать WM_QUIT или WM_DESTROY. Только как это делается под Vb? smile  

Автор: Rrader 12.5.2008, 11:47
Код

Private Declare Function PostThreadMessage Lib "user32" Alias "PostThreadMessageA" _
  (ByVal idThread As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  
Const WM_QUIT = &H12
Const ClassName = "MozillaUIWindowClass"

Private Sub Command1_Click()
  Dim ThreadID As Long
  Dim Wnd As Long
  Wnd = FindWindow(ClassName, vbNullString)
  If Wnd = 0 Then Exit Sub
  ThreadID = GetWindowThreadProcessId(Wnd, 0)
  Call PostThreadMessage(ThreadID, WM_QUIT, 0, 0)
End Sub

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)