2010-12-10 2 views

ответ

1

Предполагая, что вы используете VB 6 (так как вы не сделали указать .NET), вы могли бы следующий код:

''#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 

в основном то, что делает этот код является перечисление всех запущенных процессов, чтобы найти тот, который вы хотите убить. CreateToolHelpSnapshot API function возвращает моментальный снимок процессов, а затем мы просматриваем этот моментальный снимок с помощью функций и Process32Next. Когда он находит совпадение с указанным вами именем, он использует TerminateProcess function для завершения этого процесса и всех его потоков. Обратите внимание, что это не проверено в версиях Windows после XP.

Если говорить Win32 свободно, обратитесь к следующей MSDN статье: Taking a Snapshot and Viewing Processes

Много примеров вы найдете в Интернете (например, option one, option two) используют EnumWindows отправить WM_CLOSE message к окнам, связанным с особый процесс. Преимущество этого заключается в том, что он запрашивает красивую отправку сообщения WM_CLOSE, что дает возможность сохранить любые данные и выйти изящно. TerminateProcess, как используется в приведенном выше примере, не так хорош - это мгновение buzz-kill. Но это будет позволит вам завершить процессы, которые не имеют никаких окон. Вы не упомянули, было ли это требование в вопросе.

(Честно говоря, в моем вопросе не хватает деталей, чтобы иметь любой бизнес пытается ответить на этот вопрос, но я затягиваю. Если вам нужно что-нибудь еще, отредактируйте свой вопрос, чтобы включить более подробную информацию и добавьте комментарий, чтобы сообщить мне об этом ...)

Смежные вопросы