2010-12-10 79 views

Répondre

1

En supposant que vous utilisez VB 6 (parce que vous ne l'avez pas spécifiez .NET), vous pourriez le code suivant:

''#Module-level WinAPI Declarations 
Private Const PROCESS_ALL_ACCESS = &H1F0FFF 
Private Const TH32CS_SNAPPROCESS As Long = 2& 

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 * 260 
End Type 

Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal blnheritHandle As Long, ByVal dwAppProcessId As Long) As Long 
Private Declare Function ProcessFirst Lib "kernel32.dll" Alias "Process32First" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long 
Private Declare Function ProcessNext Lib "kernel32.dll" Alias "Process32Next" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long 
Private Declare Function CreateToolhelpSnapshot Lib "kernel32.dll" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, lProcessID As Long) As Long 
Private Declare Function TerminateProcess Lib "kernel32.dll" (ByVal ApphProcess As Long, ByVal uExitCode As Long) As Long 
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long 

''#Public function to actually kill a process, given its name 
Public Sub KillProcess(ByVal ProcessName As String) 
    Dim uProcess As PROCESSENTRY32 
    Dim RProcessFound As Long 
    Dim hSnapshot As Long 
    Dim SzExeName As String 
    Dim ExitCode As Long 
    Dim MyProcess As Long 
    Dim AppKill As Boolean 
    Dim AppCount As Integer 
    Dim i As Integer 

    If LenB(ProcessName) <> 0 Then 
     AppCount = 0 

     uProcess.dwSize = Len(uProcess) 
     hSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&) 
     RProcessFound = ProcessFirst(hSnapshot, uProcess) 

     Do 
      i = InStr(1, uProcess.szexeFile, Chr(0)) 
      SzExeName = LCase$(Left$(uProcess.szexeFile, i - 1)) 

      If Right$(SzExeName, Len(ProcessName)) = LCase$(ProcessName) Then 
       AppCount = AppCount + 1 
       MyProcess = OpenProcess(PROCESS_ALL_ACCESS, False, uProcess.th32ProcessID) 
       AppKill = TerminateProcess(MyProcess, ExitCode) 
       Call CloseHandle(MyProcess) 
      End If 

      RProcessFound = ProcessNext(hSnapshot, uProcess) 
     Loop While RProcessFound 

     Call CloseHandle(hSnapshot) 
    End If 
End Sub 

Fondamentalement, ce que ce code est fait d'énumérer tous les processus en cours d'exécution afin de trouver celui que vous voulez tuer. Le CreateToolHelpSnapshot API function renvoie un instantané des processus, puis nous parcourons cet instantané avec les fonctions Process32First et Process32Next. Lorsqu'il trouve une correspondance avec le nom que vous avez spécifié, il utilise le TerminateProcess function pour terminer ce processus et tous ses threads. Notez que ceci n'est pas testé sur les versions post-XP de Windows.

Si vous parlez Win32 couramment, consultez l'article MSDN suivant: Taking a Snapshot and Viewing Processes

Beaucoup des exemples que vous trouverez sur Internet (c.-à-option one, option two) utiliser EnumWindows envoyer un WM_CLOSE message aux fenêtres associées à une processus particulier. L'avantage de ceci est qu'il demande gentiment-envoyer le message WM_CLOSE donne au processus une chance d'enregistrer des données et quitter gracieusement. TerminateProcess, comme utilisé dans l'exemple ci-dessus, n'est pas si agréable, c'est un instant buzz-kill. Mais il vous permettra de mettre fin à des processus qui ne possèdent aucune fenêtre. Vous n'avez pas mentionné si c'était une exigence dans la question.

(Honnêtement, il n'y a pas suffisamment de détails dans la question pour moi d'avoir toute entreprise essayer de répondre à cette question, mais je tergiverser. Si vous avez besoin d'autre chose, s'il vous plaît modifier votre question d'inclure plus de détails et ajouter un commentaire pour me le faire savoir ...)