VB监控进程并终止进程苦于网吧有人开pplive,qqdownload等占带宽软件,导致整个网吧几乎卡掉, 于是想写一个监控进程,并自动关闭一些此类软件的程序。 组成:一个saft.exe,一个close_id.txt(用于保存要杀的进程,方便随时添加编辑) 以下是代码: 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 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 Function fun_FindProcess(ByVal ProcessName As String) As Long Dim strdata As String Dim my As PROCESSENTRY32 Dim l As Long Dim l1 As Long Dim mName As String Dim i As Integer, pid As Long 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(ProcessName) Then pid = my.th32ProcessID fun_FindProcess = pid Exit Function End If Loop Until (Process32Next(l, my) < 1) End If l1 = CloseHandle(l) End If fun_FindProcess = 0 End Function
Private Sub Form_Load() App.Title = "" '在任务管理器的应用程序中隐藏这个程序 End Sub
Private Sub Timer1_Timer() '定时器每一分钟动作一次 Dim uid$ Open App.Path "\close_id.txt" For Input As #1 '记事本close_id.txt上每行一个你要关闭的程序名 Do While Not EOF(1) '历遍每行 Line Input #1, uid If fun_FindProcess(uid) <> 0 Then '调用上面的函数判断是否存在这个进程,有则杀 Shell ("cmd /c taskkill /f /im " & uid), vbHide End If Loop Close #1 End Sub
Dim objWMIService As Variant Dim strName As String Dim strSize As StringPrivate Sub Form_Load() Timer1.Enabled = False Timer1.Interval = 3000 Command1.Caption = "開始監控"
strName = "w3wp.exe" strSize = CStr(200# * 1024 * 1024) Set objWMIService = GetObject("winmgmts:") End SubPrivate Sub Command1_Click() If Command1.Caption = "開始監控" Then Timer1.Enabled = True Command1.Caption = "停止監控" Else Timer1.Enabled = False Command1.Caption = "開始監控" End If End SubPrivate Sub Timer1_Timer() For Each objItem In objWMIService.ExecQuery _ ("Select * from Win32_Process Where Name='" & strName & "' And WorkingSetSize>=" & strSize) objItem.Terminate Next End Sub
修改一下 Dim objWMIService As Variant Dim strWQL As StringPrivate Sub Form_Load() Timer1.Enabled = False Timer1.Interval = 3000 Command1.Caption = "開始監控" strWQL = "Select * from Win32_Process Where Name='" & "w3wp.exe" & "' And WorkingSetSize>=" & CStr(200# * 1024 * 1024) Set objWMIService = GetObject("winmgmts:") End SubPrivate Sub Command1_Click() If Command1.Caption = "開始監控" Then Timer1.Enabled = True Command1.Caption = "停止監控" Else Timer1.Enabled = False Command1.Caption = "開始監控" End If End SubPrivate Sub Timer1_Timer() For Each objItem In objWMIService.ExecQuery(strWQL) objItem.Terminate Next End Sub
Public Function processkill(testok As Boolean, killprocess As String) As Boolean Dim m As Integer Dim temindex As Integer Dim jcid As Double Dim mProcID As Long Dim excelb As Boolean excelb = False dolistIf lvwPrss.ListItems.Count = 0 Then Exit Function End Iftemindex = 0 For m = 1 To lvwPrss.ListItems.Count On Error GoTo e If LCase(Trim(lvwPrss.ListItems(m).SubItems(1))) = LCase(killprocess) Then If temindex = 0 Or temindex < CInt(lvwPrss.ListItems.Item(m).Index) Then 'lvwPrss.ListItems.Item(m).Checked = True temindex = CInt(lvwPrss.ListItems.Item(m).Index) jcid = CDbl(lvwPrss.ListItems.Item(m).Text) excelb = True End If If testok = True Then mProcID = OpenProcess(1&, -1&, jcid) TerminateProcess mProcID, 0& DoEvents lvwPrss.ListItems.Remove (temindex) lvwPrss.Refresh If excelb = True Then processkill = True End If End If Nexte: End Function
于是想写一个监控进程,并自动关闭一些此类软件的程序。
组成:一个saft.exe,一个close_id.txt(用于保存要杀的进程,方便随时添加编辑)
以下是代码:
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
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 Function fun_FindProcess(ByVal ProcessName As String) As Long
Dim strdata As String
Dim my As PROCESSENTRY32
Dim l As Long
Dim l1 As Long
Dim mName As String
Dim i As Integer, pid As Long
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(ProcessName) Then
pid = my.th32ProcessID
fun_FindProcess = pid
Exit Function
End If
Loop Until (Process32Next(l, my) < 1)
End If
l1 = CloseHandle(l)
End If
fun_FindProcess = 0
End Function
Private Sub Form_Load()
App.Title = "" '在任务管理器的应用程序中隐藏这个程序
End Sub
Private Sub Timer1_Timer() '定时器每一分钟动作一次
Dim uid$
Open App.Path "\close_id.txt" For Input As #1 '记事本close_id.txt上每行一个你要关闭的程序名
Do While Not EOF(1) '历遍每行
Line Input #1, uid
If fun_FindProcess(uid) <> 0 Then '调用上面的函数判断是否存在这个进程,有则杀
Shell ("cmd /c taskkill /f /im " & uid), vbHide
End If
Loop
Close #1
End Sub
博客网版权所有
Dim strName As String
Dim strSize As StringPrivate Sub Form_Load()
Timer1.Enabled = False
Timer1.Interval = 3000
Command1.Caption = "開始監控"
strName = "w3wp.exe"
strSize = CStr(200# * 1024 * 1024)
Set objWMIService = GetObject("winmgmts:")
End SubPrivate Sub Command1_Click()
If Command1.Caption = "開始監控" Then
Timer1.Enabled = True
Command1.Caption = "停止監控"
Else
Timer1.Enabled = False
Command1.Caption = "開始監控"
End If
End SubPrivate Sub Timer1_Timer()
For Each objItem In objWMIService.ExecQuery _
("Select * from Win32_Process Where Name='" & strName & "' And WorkingSetSize>=" & strSize)
objItem.Terminate
Next
End Sub
Dim objWMIService As Variant
Dim strWQL As StringPrivate Sub Form_Load()
Timer1.Enabled = False
Timer1.Interval = 3000
Command1.Caption = "開始監控" strWQL = "Select * from Win32_Process Where Name='" & "w3wp.exe" & "' And WorkingSetSize>=" & CStr(200# * 1024 * 1024)
Set objWMIService = GetObject("winmgmts:")
End SubPrivate Sub Command1_Click()
If Command1.Caption = "開始監控" Then
Timer1.Enabled = True
Command1.Caption = "停止監控"
Else
Timer1.Enabled = False
Command1.Caption = "開始監控"
End If
End SubPrivate Sub Timer1_Timer()
For Each objItem In objWMIService.ExecQuery(strWQL)
objItem.Terminate
Next
End Sub
Dim m As Integer
Dim temindex As Integer
Dim jcid As Double
Dim mProcID As Long
Dim excelb As Boolean
excelb = False
dolistIf lvwPrss.ListItems.Count = 0 Then
Exit Function
End Iftemindex = 0
For m = 1 To lvwPrss.ListItems.Count
On Error GoTo e
If LCase(Trim(lvwPrss.ListItems(m).SubItems(1))) = LCase(killprocess) Then
If temindex = 0 Or temindex < CInt(lvwPrss.ListItems.Item(m).Index) Then
'lvwPrss.ListItems.Item(m).Checked = True
temindex = CInt(lvwPrss.ListItems.Item(m).Index)
jcid = CDbl(lvwPrss.ListItems.Item(m).Text)
excelb = True
End If
If testok = True Then
mProcID = OpenProcess(1&, -1&, jcid)
TerminateProcess mProcID, 0&
DoEvents
lvwPrss.ListItems.Remove (temindex)
lvwPrss.Refresh
If excelb = True Then processkill = True
End If
End If
Nexte:
End Function