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 ;) )
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.