进程检测与关闭
检测并关闭指定的进程
添加模块代码:
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) 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 CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal blnheritHandle As Long, ByVal dwAppProcessId As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal ApphProcess As Long, ByVal uExitCode As Long) As Long
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
Const TH32CS_SNAPHEAPLIST = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPTHREAD = &H4
Const TH32CS_SNAPMODULE = &H8
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Const TH32CS_INHERIT = &H80000000
Dim pid As Long
Dim pname As String
'-关闭某进程的过程-----------------------------------------------
Public Sub KillProcess(ByVal sEndProess As String) '入口参数为进程名
Dim my As PROCESSENTRY32
Dim L As Long
Dim L1 As Long
Dim Flag As Boolean
Dim mName As String
Dim i As Integer
L = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
If L Then
my.dwSize = 1060
If (Process32First(L, my)) Then '遍历第一个进程
Do
i = InStr(1, my.szExeFile, Chr(0))
mName = LCase(Left(my.szExeFile, i - 1))
If mName = LCase(sEndProess) Then
pid = my.th32ProcessID
pname = mName
Dim mProcID As Long
mProcID = OpenProcess(1&, -1&, pid)
TerminateProcess mProcID, 0&
Flag = True
Exit Sub
Else
Flag = False
End If
Loop Until (Process32Next(L, my) < 1) '遍历所有进程知道返回值为False
End If
L1 = CloseHandle(L)
End If
End Sub
'判断某进程是否存在的函数
Public Function FindProcess(ByVal sEndProess As String) As Boolean
Dim my As PROCESSENTRY32
Dim L As Long
Dim L1 As Long
Dim Flag As Boolean
Dim mName As String
Dim i As Integer
Dim JieGuo As Boolean
JieGuo = False
L = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
If L Then
my.dwSize = 1060
If (Process32First(L, my)) Then '遍历第一个进程
Do
i = InStr(1, my.szExeFile, Chr(0))
mName = LCase(Left(my.szExeFile, i - 1))
If mName = LCase(sEndProess) Then
JieGuo = True
Exit Do
End If
Loop Until (Process32Next(L, my) < 1) '遍历所有进程知道返回值为False
End If
L1 = CloseHandle(L)
End If
FindProcess = JieGuo
End Function
'=====================
'补充以上代码可以查找或者关闭指定的进程,函数入口参数为字符串类型,
'例如要关闭记事本,可以调用 Call KillProcess("notepad.exe")
'如果你要使关闭包含“111”字符串的进程
'可以把上面的两个函数中的 If mName = LCase(sEndProess) Then 都改为下面的语句
If Instr(nName,LCase(sEndProess)) Then 即可
然后这么调用 Call KillProcess("111") 即可杀死包含“111”的进程
不过这个函数一次只能杀死一个进程,所以你必须使用Timer控件,设置Interval为10,来不断地杀死进程
'利用正则表达式的完整代码如下:
Option Explicit
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) 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 CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal blnheritHandle As Long, ByVal dwAppProcessId As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal ApphProcess As Long, ByVal uExitCode As Long) As Long
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
Const TH32CS_SNAPHEAPLIST = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPTHREAD = &H4
Const TH32CS_SNAPMODULE = &H8
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Const TH32CS_INHERIT = &H80000000
Dim pid As Long, Re
Dim pname As String
'-关闭某进程的过程-----------------------------------------------
Public Sub KillProcess() '入口参数为进程名
Dim my As PROCESSENTRY32
Dim L As Long
Dim L1 As Long
Dim Flag As Boolean
Dim mName As String
Dim i As Integer
Dim parten As String
parten = "\d{2,}"
L = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
If L Then
my.dwSize = 1060
If (Process32First(L, my)) Then '遍历第一个进程
Do
i = InStr(1, my.szExeFile, Chr(0))
mName = LCase(Left(my.szExeFile, i - 1))
'If InStr(0, nName, LCase(sEndProess)) <> 0 Then
If bTest(mName, parten) Then
pid = my.th32ProcessID
pname = mName
Dim mProcID As Long
mProcID = OpenProcess(1&, -1&, pid)
TerminateProcess mProcID, 0&
CloseHandle mProcID
Flag = True
Exit Sub
Else
Flag = False
End If
Loop Until (Process32Next(L, my) < 1) '遍历所有进程知道返回值为False
End If
L1 = CloseHandle(L)
End If
End Sub
Function bTest(ByVal s As String, ByVal p As String) As Boolean
Re.IgnoreCase = False '设置是否匹配大小写
Re.Pattern = p
bTest = Re.Test(s)
End Function
Private Sub Form_Load()
Set Re = CreateObject("VBScript.RegExp")
Timer1.Interval = 50
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set Re = Nothing
End Sub
Private Sub Timer1_Timer()
Call KillProcess
End Sub