VB中对进程的管理

界面部分:界面上4个CommandButton按钮,一个ListBox列表框

代码部分:

Option Explicit
Dim ProcessID() As Long                                          ' 按list1中的进程顺序存储所有进程ID

'---------- API类型声明   -----------
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 * 1024
End Type

Private Type MODULEENTRY32                  '模块
    dwsize As Long
    th32ModuleID As Long
    th32ProcessID As Long
    GlblcntUsage As Long
    ProccntUsage As Long
    modBaseAddr As Byte
    modBaseSize As Long
    hModule As Long
    szModule As String * 256
    szExePath As String * 1024
End Type

Private Type THREADENTRY32                  '线程
    dwsize As Long
    cntusage As Long
    th32threadID As Long
    th32OwnerProcessID As Long
    tpBasePri As Long
    tpDeltaPri As Long
    dwFlags As Long
End Type

'----------------------------------------- API声明 -------------------------------------------------------
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function Module32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As MODULEENTRY32) As Long
Private Declare Function Module32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As MODULEENTRY32) As Long
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Private Declare Function Thread32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As THREADENTRY32) As Long
Private Declare Function Thread32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As THREADENTRY32) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long

'---------------------------------------- API常数声明 ------------------------------------------------------
Private Const TH32CS_SNAPHEAPLIST = &H1
Private Const TH32CS_SNAPPROCESS = &H2
Private Const TH32CS_SNAPTHREAD = &H4
Private Const TH32CS_SNAPMODULE = &H8
Private Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Private Const TH32CS_INHERIT = &H80000000
Private Const PROCESS_TERMINATE = &H1&

Private Sub Command1_Click()    '查找进程 按钮
Dim Process As PROCESSENTRY32
Dim ProcSnap As Long
Dim cntProcess As Long
cntProcess = 0
List1.Clear
ProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
If ProcSnap Then
    Process.dwsize = 1060                                        
    Process32First ProcSnap, Process
    Do Until Process32Next(ProcSnap, Process) < 1                ' 遍历所有进程直到返回值为False
        List1.AddItem Trim(Process.szExeFile)
        cntProcess = cntProcess + 1
    Loop
End If
ReDim ProcessID(cntProcess) As Long
Dim i As Long
i = 0
Process32First ProcSnap, Process
Do Until Process32Next(ProcSnap, Process) < 1                    ' 遍历所有进程直到返回值为False
    ProcessID(i) = Process.th32ProcessID
    i = i + 1
Loop
CloseHandle (ProcSnap)
End Sub

Private Sub Command2_Click()    '结束进程 按钮
Dim c As Integer
If List1.ListIndex < 0 Then
    MsgBox "请选择进程!", vbOKOnly + vbInformation, "提示"
Else
    Dim hProcess As Long
    hProcess = OpenProcess(PROCESS_TERMINATE, False, ProcessID(List1.ListIndex))
    If hProcess Then TerminateProcess hProcess, 0
    c = List1.ListCount
    While List1.ListCount = c
        Command1_Click
    Wend
End If
End Sub

Private Sub Command3_Click()    '退出按钮
Unload Me
End Sub

Private Sub Command4_Click()'结束指定的进程ID,例如gnugk.exe
'遍历所有进程,并将进程前9个字符等于gnugk.exe的进程ID存放在killID这个变量中
'---遍历开始
1:
    Dim killID As Long
   
    Dim Process As PROCESSENTRY32
    Dim ProcSnap As Long
    Dim cntProcess As Long
        cntProcess = 0
        ProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
    If ProcSnap Then
        Process.dwsize = 1060                                        ' 通常用法
        Process32First ProcSnap, Process
        Do Until Process32Next(ProcSnap, Process) < 1                ' 遍历所有进程直到返回值为False
            If Left(Trim(Process.szExeFile), 9) = "gnugk.exe" Then killID = Process.th32ProcessID
            Debug.Print killID
            cntProcess = cntProcess + 1
        Loop
    End If
    ReDim ProcessID(cntProcess) As Long
    Dim i As Long
    i = 0
    Process32First ProcSnap, Process
    Do Until Process32Next(ProcSnap, Process) < 1                    ' 遍历所有进程直到返回值为False
        ProcessID(i) = Process.th32ProcessID
        i = i + 1
    Loop
    CloseHandle (ProcSnap)
'---遍历结束

'结束所有gnugk.exe开头的进程
    If killID < 1 Then
        MsgBox "Kill Over", vbInformation, "Kill Process"
        Exit Sub
    Else
   
    Dim hProcess As Long
        hProcess = OpenProcess(PROCESS_TERMINATE, False, killID)    '获取进程句柄
    TerminateProcess hProcess, 0    '关闭进程
    killID = 0
    GoTo 1
    End If
End Sub

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值