Мне нужно примерно убить приложение, чтобы я мог получить фантомного подписчика этого приложения в моей базе данных (это не может быть получено путем закрытия приложения). Вручную, если мы убьем приложение из диспетчера задач, фантомный подписчик будет существовать. Теперь мне нужно сделать это автоматически в коде VB 6. Помощь! Спасибо.
Завершить процесс из диспетчера задач с помощью кода VB 6
Ответы (7)
Есть два пути:
Отправьте
WM_CLOSE
целевому приложению, если у него есть окно (скрытое / видимое). «Завершить задачу» диспетчера задач использует этот метод. Большинство приложений обрабатывают WM_CLOSE и корректно завершают работу.Используйте
TerminateProcess
API для принудительного уничтожения - «Конечный процесс» диспетчера задач использует этот метод. Этот API насильно убивает процесс.
Пример можно найти здесь:
VB Helper: HowTo: немедленно завершить процесс
Используйте vb6.0 TaskKill
Private Sub Command1_Click()
Shell "taskkill.exe /f /t /im Application.exe"
End Sub
Вызовите ShellExecute с помощью команды TaskKill.
TASKKILL [/ S система [/ U имя пользователя [/ P [пароль]]]] {[/ FI фильтр] [/ PID processid | / IM imagename]} [/ T] [/ F]
Описание: этот инструмент используется для завершения задач по идентификатору процесса (PID) или имени образа.
Shell "taskkill.exe /f /t /im processname.exe"
Это заставляет (/f
) завершить процесс с именем образа (/im
) для processname.exe и всех дочерних процессов, которые были запущены им (/t
). Возможно, вам не понадобятся все эти переключатели. Для получения дополнительной информации см. Справку по команде taskkill
(введите в командной строке следующее):
taskkill/?
Превосходный архив кода VB6 Карла Петерсона содержит высококачественный образец кода и полные пояснения с использованием как WM_CLOSE, так и TerminateProcess. Никаких заменителей не принимаю!
Одна ошибка, которую вы можете увидеть в большом количестве кода, заключается в том, что отправки WM_CLOSE на единственный дескриптор окна, который у вас есть, недостаточно - большинство приложений содержат множество окон. Ответ, реализованный в коде Карла: найдите все окна верхнего уровня, принадлежащие этому приложению, и отправьте сообщение каждому.
Вот мой код в vb6, чтобы убить процесс по имени
Меня устраивает
Private Sub TerminateProcess(ProcessName As String)
Dim Process As Object
For Each Process In GetObject("winmgmts:").ExecQuery("Select Name from Win32_Process Where Name = '" & ProcessName & "'")
Process.Terminate
Next
End Sub
Это делается внутренними способами VB6 ...
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Public Sub KillProcess(ByVal processName As String)
Set oWMI = GetObject("winmgmts:")
Set oServices = oWMI.InstancesOf("win32_process")
For Each oService In oServices
servicename = LCase(Trim(CStr(oService.Name) & ""))
If InStr(1, servicename, LCase(processName), vbTextCompare) > 0 Then
oService.Terminate
End If
Next
End Sub
... и просто используйте его следующим образом:
killProcess("notepad.exe")
Второй вариант: [от SHELL внешними способами ...]
Shell "taskkill.exe /f /t /im notepad.exe"