Killer un processus en ne connaissant que son nom (vb6)

Contenu du snippet

Sur kernerl32.dll donc windows xp, il suffit d'appeler la fonction avec comme parametre le nom du processus à killer: killprocessus("explorer.exe")
Ca parcours la liste des processus qui s'executent et trouve (ou non) le premier processus du nom voulu et le ferme.
Plus qu'a savoir ce qu'est que le nom d'un processus, c pas un chemin, ni une url, mais juste le nom du processus, donc celui qui figure dans l'onglet "processus" du gestionnaire des taches

Source / Exemple :


Attribute VB_Name = "processus"
Option Compare Database
Option Explicit

'----------------------------------------------------------------------------------------------------------'
'               déclaration des types utilisés
'----------------------------------------------------------------------------------------------------------'
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
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, lProcessID As Long) As Long

'----------------------------------------------------------------------------------------------------------'
'               déclaration des types utilisés
'----------------------------------------------------------------------------------------------------------'
Const MAX_PATH As Integer = 260

Private Type LUID
    LowPart As Long
    HighPart As Long
End Type

Private Type LUID_AND_ATTRIBUTES
    pLuid As LUID
    Attributes As Long
End Type

Private Type TOKEN_PRIVILEGES
    PrivilegeCount As Long
    TheLuid As LUID
    Attributes As Long
End Type

Private Type PROCESSENTRY32
    dwSize As Long
    cntUsage As Long
    th32ProcessID As Long
    th32DefaultHeapID As Long
    th32ModuleID As Long
    cntThreads As Long
    th32ParentProcessID As Long
    pcPriClassBase As Long
    dwFlags As Long
    szexeFile As String * MAX_PATH
End Type

'----------------------------------------------------------------------------------------------------------'
'               Terminer un processus : fonction système à ne surtout pas comprendre !!
'----------------------------------------------------------------------------------------------------------'
Private Function ProcessTerminate(Optional lProcessID As Long, Optional lHwndWindow As Long) As Boolean
     Dim lhwndProcess As Long
     Dim lExitCode As Long
     Dim lRetVal As Long
     Dim lhThisProc As Long
     Dim lhTokenHandle As Long
     Dim tLuid As LUID
     Dim tTokenPriv As TOKEN_PRIVILEGES, tTokenPrivNew As TOKEN_PRIVILEGES
     Dim lBufferNeeded As Long
     Const PROCESS_ALL_ACCESS = &H1F0FFF, PROCESS_TERMINAT = &H1
     Const ANYSIZE_ARRAY = 1, TOKEN_ADJUST_PRIVILEGES = &H20
     Const TOKEN_QUERY = &H8, SE_DEBUG_NAME As String = "SeDebugPrivilege"
     Const SE_PRIVILEGE_ENABLED = &H2

     On Error Resume Next
     If lHwndWindow Then
        lRetVal = GetWindowThreadProcessId(lHwndWindow, lProcessID)
     End If
     If lProcessID Then
        lhThisProc = GetCurrentProcess
        OpenProcessToken lhThisProc, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, lhTokenHandle
        LookupPrivilegeValue "", SE_DEBUG_NAME, tLuid
        tTokenPriv.PrivilegeCount = 1
        tTokenPriv.TheLuid = tLuid
        tTokenPriv.Attributes = SE_PRIVILEGE_ENABLED
        AdjustTokenPrivileges lhTokenHandle, False, tTokenPriv, Len(tTokenPrivNew), tTokenPrivNew, lBufferNeeded
        lhwndProcess = OpenProcess(PROCESS_TERMINAT, 0, lProcessID)
        If lhwndProcess Then
         ProcessTerminate = CBool(TerminateProcess(lhwndProcess, lExitCode))
         Call CloseHandle(lhwndProcess)
        End If
     End If
     On Error GoTo 0
End Function

'----------------------------------------------------------------------------------------------------------'
'               trouver un processus en fonction de son nom placé en paramètre
'----------------------------------------------------------------------------------------------------------'
Public Function KillProcessus(ByVal sProcessNameExe As String) As String
     Dim i As Integer
     Dim hSnapshot As Long
     Dim uProcess As PROCESSENTRY32
     Dim r As Long
     Dim NOM(1 To 100)
     Dim num(1 To 100)
     Dim NR As Integer
     Const TH32CS_SNAPPROCESS As Long = 2&
     
     NR = 0
     hSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&)	' faire un instantané des processus s'executant au moment voulu
     If hSnapshot = 0 Then Exit Function			' si y'a pas alors ça sert à rien de continuer
     uProcess.dwSize = Len(uProcess)		' initialisation de uProcess
     r = ProcessFirst(hSnapshot, uProcess)	' on met dans r le premier processus rencontré
     
     Do While r					' faire tant que y'a des processus dans la liste
        NR = NR + 1 				' incrémentation de l'indice
        NOM(NR) = uProcess.szexeFile 		' rempli le tableau de noms de processus
        num(NR) = uProcess.th32ProcessID  	' rempli le tableau d'ID de processus
        r = ProcessNext(hSnapshot, uProcess) 	' on essaie de passer au processus suivant
     Loop
     
     For i = 1 To NR				' pour tous les processus listés
         If InStr(UCase(NOM(i)), UCase(sProcessNameExe)) <> 0 Then  ' si c le bon
            ProcessTerminate (num(i))		' on le nique
            Exit For				' et on sort (à enlever si on veut tuer tous les processus du nom sProcessNameExe
         End If
     Next i
     
End Function					' fin

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.