Visual Basic para Aplicaciones - Crear Kill Process Multiple

Life is soft - evento anual de software empresarial
 
Vista:

Crear Kill Process Multiple

Publicado por Rubén (4 intervenciones) el 21/06/2010 18:23:52
Hola a todos, dispongo de un código que encontré por el web para crear un matador de procesos, pero tiene un problema, y es que solo sirve para matar un proceso cada vez, qué tendría que implementar para poder matar varios a la vez? Aclaro que en las propiedades del List Box he activado Multiselect - 2 Extended, pero aun así solo mata el último proceso y no los que marco..

Este es el código:

Option Explicit

' Variables para usar Wmi
Dim ListaProcesos As Object
Dim ObjetoWMI As Object
Dim ProcesoACerrar As Object

Private Function MatarProceso( _
StrNombreProceso As String, _
Optional DecirSINO As Boolean = True) As Boolean

MatarProceso = False

Set ObjetoWMI = GetObject("winmgmts:")

If IsNull(ObjetoWMI) = False Then

'instanciamos la variable
Set ListaProcesos = ObjetoWMI.InstancesOf("win32_process")

For Each ProcesoACerrar In ListaProcesos
If UCase(ProcesoACerrar.Name) = UCase(StrNombreProceso) Then
If DecirSINO Then
If MsgBox("¿Matar el proceso " & _
ProcesoACerrar.Name & vbNewLine & "...¿Está seguro?", _
vbYesNo + vbCritical) = vbYes Then
ProcesoACerrar.Terminate (0)
MatarProceso = True
End If

Else

'Matamos el proceso con el método Terminate
ProcesoACerrar.Terminate (0)
MatarProceso = True

End If
End If

Next
End If

'Elimina las variables
Set ListaProcesos = Nothing
Set ObjetoWMI = Nothing
End Function

Private Sub Listar()

Set ObjetoWMI = GetObject("winmgmts:")

If IsNull(ObjetoWMI) = False Then
' En esta variable se obtienen los procesos
Set ListaProcesos = ObjetoWMI.InstancesOf("win32_process")
'Recorremos toda la coleccion en la lista de procesos _
y la añadimos al control listbox
For Each ProcesoACerrar In ListaProcesos
List1.AddItem LCase$(ProcesoACerrar.Name)
Next
End If

'Eliminamos las variables de objeto

Set ListaProcesos = Nothing
Set ObjetoWMI = Nothing

End Sub

Private Sub Command1_Click()

'Llamamos a MatarProceso pasandole el nombre
MatarProceso LCase$(List1), True
'Borramos el list
List1.Clear
'Volvemos a listar los procesos
Call Listar

End Sub

Private Sub Command2_Click()
'Borramos la lista y volvemos a listar los procesos
List1.Clear
Call Listar
End Sub

Private Sub Form_Load()
Command2.Caption = " Listar Procesos"
Command1.Caption = " Cerrar Proceso "
Me.Caption = " Wmi - ejemplo para manipular procesos de windows "
End Sub

Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de JuanC

RE:Crear Kill Process Multiple

Publicado por JuanC (565 intervenciones) el 21/06/2010 23:01:34
deberías hacer un bucle en Command1_Click()

Dim i%
For i = 0 To Listb.ListCount - 1
If Listb.Selected(i) Then
'//MatarProceso (Listb.List(i)), True
End If
Next

Saludos, desde Baires, JuanC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Crear Kill Process Multiple

Publicado por Rubén (4 intervenciones) el 22/06/2010 05:52:47
Gracias JuanC!!!

Funcionó a la perfección!

Saludos desde Salamanca, España
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE: Agrupacion en Msgbox

Publicado por Rubén (4 intervenciones) el 22/06/2010 17:18:32
Hola de nuevo, ya resuelto el anterior problema y toqueteando alguna cosa más, surge un nuevo problema..

Lo que necesito es que al seleccionar varios y pulsar para matar los procesos, que muestre un solo msgbox con el listado, en vez de un msgbox para cada archivo.

Podríais decirme cómo sería? adjunto el code de cómo va quedando:

Option Explicit

' Variables para usar Wmi
Dim ListaProcesos As Object
Dim ObjetoWMI As Object
Dim ProcesoACerrar As Object

Private Function MatarProceso( _
StrNombreProceso As String, _
Optional DecirSINO As Boolean = True) As Boolean

MatarProceso = False

Set ObjetoWMI = GetObject("winmgmts:")

If IsNull(ObjetoWMI) = False Then

'instanciamos la variable
Set ListaProcesos = ObjetoWMI.InstancesOf("win32_process")

For Each ProcesoACerrar In ListaProcesos
If UCase(ProcesoACerrar.Name) = UCase(StrNombreProceso) Then
If DecirSINO Then
If MsgBox("Matar el proceso " & _
ProcesoACerrar.Name & vbNewLine & "Estás seguro?", _
vbYesNo + vbQuestion, "Kill Process") = vbYes Then
ProcesoACerrar.Terminate (0)
MatarProceso = True
End If

Else

'Matamos el proceso con el método Terminate
ProcesoACerrar.Terminate (0)
MatarProceso = True

End If
End If

Next
End If

'Elimina las variables
Set ListaProcesos = Nothing
Set ObjetoWMI = Nothing
End Function

Private Sub Listar()

Set ObjetoWMI = GetObject("winmgmts:")

If IsNull(ObjetoWMI) = False Then
' En esta variable se obtienen los procesos
Set ListaProcesos = ObjetoWMI.InstancesOf("win32_process")
'Recorremos toda la coleccion en la lista de procesos _
y la añadimos al control listbox
For Each ProcesoACerrar In ListaProcesos
List1.AddItem LCase$(ProcesoACerrar.Name)
Next
End If

'Eliminamos las variables de objeto

Set ListaProcesos = Nothing
Set ObjetoWMI = Nothing

End Sub

Private Sub Command1_Click()

Dim i%
For i = 0 To List1.ListCount - 1
If List1.Selected(i) Then
MatarProceso (List1.List(i)), True
End If
Next

'Llamamos a MatarProceso pasandole el nombre
'Borramos el list
List1.Clear
'Volvemos a listar los procesos
Call Listar

End Sub

Private Sub Command2_Click()
'Borramos la lista y volvemos a listar los procesos
List1.Clear
Call Listar
End Sub

Private Sub Form_Load()
Call Listar
Command2.Caption = " Listar Procesos"
Command1.Caption = " Cerrar Proceso/s "
Me.Caption = " Multi Kill Process By Metal_Kingdom "
Form1.Picture = LoadPicture()
End Sub

Muchas gracias por vuestra ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de JuanC

RE: Agrupacion en Msgbox

Publicado por JuanC (565 intervenciones) el 22/06/2010 23:18:06
basta con insertar la pregunta del MsgBox antes del For ... Next
que cierra todos todos los procesos...
demasiado simple no?

Saludos, desde Baires, JuanC
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE: Agrupacion en Msgbox

Publicado por Rubén (4 intervenciones) el 23/06/2010 12:40:17
Gracias, aunque debo estar haciéndolo mal porque no consigo poner el msgbox y que funcione, estoy aprendiendo y me repatea no conseguir una chorrada así..
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar