Kill d'un processus sous nt avec son nom

Description

Bon, il y a bien 14.000 source sur comment killer un processus, mais j'en ai trouvé aucun qui marche sous Windows NT4.0. Alors s'il y en a qui marchent encore à ça (comme moi au taff), ça peut toujours servir!

J'ai mis les 2 modules dans les sources, si vous avez déjà les protos de PSAPI dans un module, copiez juste le code ci dessous.

Vous pouvez aussi récupérer les sources des protos sur le net (ce que j'ai fais)

L'appel se fait ainsi :
KillProcess ("excel.exe")

Source / Exemple :


Option Explicit

Private Const MAX_PATH = 260
Private Const PROCESS_VM_READ = &H10
Private Const PROCESS_QUERY_INFORMATION = &H400

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessID As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long 'API de fermeture de Process

Public Sub KillProcess(ProcName As String)
Dim tmpProcname As String
Dim aProcesses() As Long
Dim cbNeeded As Long
Dim cProcesses As Long
Dim hProcess As Long
Dim i As Long
   ' // aProcesses : liste des processus
    ReDim aProcesses(0 To 1023) As Long
   If (EnumProcesses(aProcesses(0), 1024 * 4, cbNeeded) <> 0) Then
      '// On regarde le nombre de process retournés:
      cProcesses = cbNeeded / 4
      '// On vérifie le nom:
      For i = 0 To cProcesses - 1
        tmpProcname = GetProcessName(aProcesses(i))
        tmpProcname = Left$(tmpProcname, Len(ProcName))
        If tmpProcname = ProcName Then
        '// Si c'est lui, on le kill
            hProcess = OpenProcess(1, False, aProcesses(i))
            Call TerminateProcess(hProcess, 4)
            Exit Sub
        End If
      Next i
   Else
      MsgBox "Failed to get process list.", vbCritical
   End If
End Sub

Public Function GetProcessName(ByVal lProcessID As Long) As String
Dim szProcessName As String
Dim lLen As Long
Dim hProcess As Long
Dim hMod(0 To 1023) As Long
Dim cbNeeded As Long
Dim lR As Long
   szProcessName = "Unknown"
   lLen = MAX_PATH
   '//Ouverture du processus
   hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or _
                                   PROCESS_VM_READ, _
                                   0, lProcessID)
   If (lProcessID = 0) Then
      szProcessName = "System Idle"
   ElseIf (lProcessID = 2) Then
      szProcessName = "System"
   Else
      '// Récupération du nom du process:
      If (hProcess <> 0) Then
         If (EnumProcessModules(hProcess, hMod(0), 1024 * 4, _
             cbNeeded)) Then
               '//On le met dans la variable:
               szProcessName = String$(lLen, 0)
               LSet szProcessName = "unknown"
               lR = GetModuleBaseName(hProcess, hMod(0), szProcessName, lLen)
         End If
      End If
   End If
   '//On ferme le process :
   CloseHandle hProcess
   GetProcessName = szProcessName
End Function

Conclusion :


Voilà, il n'est surement pas parfait, mais ça marche.
Si vous avez des améliorations à apporter, faites les partager, ça peut toujorus servir (à moi notamment ;) )

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.