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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 16 421 fois - Téléchargée 29 fois

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

Ajouter un commentaire

Commentaires

Messages postés
7
Date d'inscription
mardi 29 mars 2005
Statut
Membre
Dernière intervention
26 avril 2009

bon pour résumer : d'après Felix_12
tskill c'est une vraie boucherie car on ne prend pas les messages d'erreur en compte
ça peut etre pratique lorsque nous ne voulons pas nous encombrer
c pas disponible sur tou sles os (sur xp ça marche)
perso si j'avais connu tskill je me serais pas pris la tête à coder tout cela...
comme ça c'est dit !
Messages postés
11
Date d'inscription
samedi 31 juillet 2004
Statut
Membre
Dernière intervention
13 juillet 2007

Désolé mais pour moi , un code qui est plus court ( une ligne au lieu d'une 50 aine)
en tenant en compte que mes programmes ne sont distribué qu'a tres petite échelle
(donc je n'ai pas a me soucier des problemes de compatibilitée).
Cela m'empeche de me mêler car si j'ai une form qui contient 50 ligne seulement pour fermer un processusà
je risque de me mêler dans mes codage tandis que si je n'en n'ai qu'une , cela est plus simple pour moi de me retrouver.
Mais je ne suis qu'un débutant , je ne mettait cette information que pour ceux qui comme moi moin c'est long ; moin c'Est compliqué
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
plus court, plus court, quel reel interet a faire plus court...

...si c'est pour faire moins compatible ? en effet, tskill n'est pas dispo sous tous les OS...
Messages postés
11
Date d'inscription
samedi 31 juillet 2004
Statut
Membre
Dernière intervention
13 juillet 2007

J'ai une solution plus facile pour ceux qui trouve cela trop long.
la voici : shell("tskill explorer")
c'est vrai quee c'est une vraie boucherie car on ne prend pas les messages d'erreur en compte mais sinon sa peut etre pratique lorsque nous ne voulons pas nous encombrer.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
dans les modules (et autres)...

Attribute VB_Name = "processus"

c'est le nom du module... tout simplement ^^ (peut etre different du nom du fichier)
Afficher les 21 commentaires

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.