|
<table cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td>
<div style="TEXT-INDENT: 24px; WORD-WRAP: break-word; FONT-SIZE: 9pt; OVERFLOW: hidden; WORD-BREAK: break-all" id="textstyle_1">
<div class="msgheader">QUOTE:</div><div class="msgborder">
<p><font face="Verdana"><br/>Option Explicit<br/>'显示XP风格函数<br/>Private Declare Sub InitCommonControls Lib "comctl32.dll" ()<br/>'显示消息函数<br/>Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long<br/>'进程创建事件<br/>Private WithEvents CreateProcessEvent As SWbemSink<br/>Attribute CreateProcessEvent.VB_VarHelpID = -1<br/>'进程结束事件<br/>Private WithEvents DeleteProcessEvent As SWbemSink<br/>Attribute DeleteProcessEvent.VB_VarHelpID = -1<br/>'进程属性更改事件<br/>Private WithEvents ModificationProcessEvent As SWbemSink<br/>Attribute ModificationProcessEvent.VB_VarHelpID = -1</font></p>
<p><font face="Verdana">Private Sub cmdExit_Click()<br/> Unload Me<br/>End Sub</font></p>
<p><font face="Verdana">Private Sub Form_Initialize()<br/> '显示XP风格<br/> InitCommonControls<br/>End Sub</font></p>
<p><font face="Verdana">Private Sub cmdAbout_Click()<br/> MessageBox 0, "欢迎你使用Chenhui530编写的“WMI进程管理器”实例源码!如" & vbNewLine & "果你在使用中发现有什么问题请及时通过以下方式转告联系我。" & Chr(13) & "QQ号码: 285305530,335429 附加消息:“VB技术交流”" & vbNewLine & "邮箱:Chenhui00530@163.com 论坛:www.chenhui530.com", "关于", vbInformation<br/>End Sub</font></p>
<p><font face="Verdana">Private Sub cmdKill_Click()<br/> Dim i As Integer, sum As Integer, checkValue As Integer<br/> '循环LISTVIEW筛选处于选中状态的ITEM<br/> For i = 1 To lvProcessexInfo.ListItems.Count<br/> If lvProcessexInfo.ListItems(i).Selected Then<br/> sum = sum + 1<br/> If UseWmiKillProcess(lvProcessexInfo.ListItems(i).SubItems(1)) Then<br/>' Me.lvProcessexInfo.ListItems.Remove i<br/> checkValue = checkValue + 1<br/> End If<br/> End If<br/> Next<br/> '这里不能用VB自带的Msgbox函数,因为VB自带的MSGBOX函数会使程序暂时处于中断状态这样结束了的进程还会显示在LISTVIEW中<br/> '这个检测当选择多个进程时的结果<br/> If checkValue <> 0 Then<br/> If checkValue = sum Then<br/> MessageBox 0, "终止进程成功!!", "提示", vbInformation<br/> Else<br/> If checkValue > 0 Then<br/> MessageBox 0, "有部分进程终止失败!!", "提示", vbInformation<br/> Else<br/> MessageBox 0, "终止进程失败!!", "提示", vbCritical<br/> End If<br/> End If<br/> Else<br/> MessageBox 0, "你还没有选择需要结束的进程呢!!", "提示", vbInformation<br/> End If<br/>End Sub</font></p>
<p><font face="Verdana">Private Sub cmdRun_Click()<br/> frmRun.Show<br/>End Sub</font></p>
<p><font face="Verdana">Private Sub Form_Load()<br/> Dim objSWbemServices As SWbemServices, process As SWbemObject, processes As SWbemObjectSet, lvItem As ListItem<br/> Dim processUserName As String, processPath As String, i As Integer, lgWorkingSetSize As Long<br/> '连接WMI服务<br/> If ConnectWmiServer(objSWbemServices, ".") Then<br/> Me.Show<br/> '限制鼠标更改窗体大小<br/> ControlSize frmMain, False<br/> '遍历进程<br/> Set processes = objSWbemServices.ExecQuery("Select * From Win32_Process")<br/> For Each process In processes<br/> DoEvents<br/> i = i + 1<br/> statusMsg.Panels.Item(1).Text = "进程数: " & i<br/> '当进程ID为0时表示是系统空闲进程<br/> If process.Properties_("ProcessID") = "0" Then<br/> Set lvItem = Me.lvProcessexInfo.ListItems.Add(, , "系统空闲进程")<br/> Else<br/> '不为0则显示其名字<br/> Set lvItem = Me.lvProcessexInfo.ListItems.Add(, , process.Properties_("Name"))<br/> End If<br/> '添加进程ID到LISTVIEW中<br/> lvItem.SubItems(1) = process.Properties_("ProcessID")<br/> '获取进程用户名称(通过进程中的GetOwner函数)<br/> processUserName = IIf(IsNull(process.ExecMethod_("GetOwner").Properties_("User")), "SYSTEM", process.ExecMethod_("GetOwner").Properties_("User"))<br/> lgWorkingSetSize = lgWorkingSetSize + (Val(process.Properties_("WorkingSetSize")) / 1024) / 1024<br/> '添加进程用户名到LISTVIEW中<br/> lvItem.SubItems(2) = processUserName<br/> '添加进程使用内存到LISTVIEW中<br/> lvItem.SubItems(3) = CStr(Val(process.Properties_("WorkingSetSize")) / 1024) & "K"<br/> statusMsg.Panels.Item(2).Text = "内存使用: " & lgWorkingSetSize & "M"<br/> '添加进程路径到LISTVIEW中(在这里先判断COMMANDLINE为空吗不为空则先判断PATH如果PATH长于COMMANDLINE就用PATH)<br/> If IsNull(process.Properties_("CommandLine")) Then<br/> If IsNull(process.Properties_("ExecutablePath")) Then<br/> processPath = ""<br/> Else<br/> processPath = process.Properties_("ExecutablePath")<br/> End If<br/> Else<br/> If Len(process.Properties_("ExecutablePath")) > Len(process.Properties_("CommandLine")) Then<br/> processPath = process.Properties_("ExecutablePath")<br/> Else<br/> processPath = process.Properties_("CommandLine")<br/> End If<br/> End If<br/> processPath = Replace(processPath, """", "")<br/> lvItem.SubItems(4) = processPath<br/> '要获取图标必须使用路径不能用COMMANDLINE<br/> If IsNull(process.Properties_("ExecutablePath")) Then<br/> processPath = ""<br/> Else<br/> processPath = process.Properties_("ExecutablePath")<br/> End If<br/> '排除进程ID为0和4的进程<br/> If process.Properties_("ProcessID") <> "0" And process.Properties_("ProcessID") <> "4" Then<br/> 'IMAGELIST添加KEY因为KEY必须为唯一而且不能为数字所以我在前面加了个H<br/> imgProcessList.ListImages.Add , "H" & process.Properties_("ProcessID"), GetIcon(processPath)<br/> lvItem.smallIcon = imgProcessList.ListImages.Item("H" & process.Properties_("ProcessID")).Key<br/> End If<br/> Next<br/> '开始进程的监视<br/> StartMonitorCreateProcessEvent<br/> StartMonitorDeleteProcessEvent<br/> StartMonitorModificationProcessEvent<br/> Else<br/> MessageBox 0, "连接不到WMI服务!!", "错误", vbCritical<br/> End If<br/> '释放对象内存<br/> SetObjectNothing objSWbemServices<br/> SetObjectNothing process<br/> SetObjectNothing processes<br/> SetObjectNothing lvItem</font></p>
<p><font face="Verdana"> '限制窗体大小<br/> OldWindowProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)<br/> Call SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WndProc)<br/> '恢复鼠标更改窗体大小<br/> ControlSize frmMain, True<br/>End Sub</font></p>
<p><font face="Verdana">Private Function GetWorkingSetSize() As String<br/> Dim i As Integer, lgWorkingSetSize As Long<br/> For i = 1 To Me.lvProcessexInfo.ListItems.Count<br/> lgWorkingSetSize = lgWorkingSetSize + Val(Me.lvProcessexInfo.ListItems(i).SubItems(3))<br/> Next<br/> GetWorkingSetSize = CStr(lgWorkingSetSize / 1024) & "M"<br/>End Function</font></p>
<p><font face="Verdana">'释放变量内存方法<br/>Private Sub SetObjectNothing(obj As Object)<br/> Set obj = Nothing<br/>End Sub</font></p>
<p><font face="Verdana">'终止进程函数<br/>Private Function UseWmiKillProcess(ByVal processId As String) As Boolean<br/> Dim objSWbemServices As SWbemServices, process As SWbemObject, processes As SWbemObjectSet, intReturn As Integer<br/> '连接WMI服务<br/> If ConnectWmiServer(objSWbemServices, ".") Then<br/> Set processes = objSWbemServices.ExecQuery("Select * From Win32_Process Where ProcessID=" & processId)<br/> For Each process In processes<br/> '调用Terminate方法结束进程<br/> intReturn = process.Terminate<br/> If intReturn = 0 Then<br/> UseWmiKillProcess = True<br/> Else<br/> UseWmiKillProcess = False<br/> End If<br/> Next<br/> Else<br/> MessageBox 0, "连接不到WMI服务!!", "错误", vbCritical<br/> End If<br/>End Function</font></p>
<p><font face="Verdana">'连接WMI服务函数(此函数也可以连接远程计算机,当要连接远程计算机时把参数“strComputerName”指示为IP地址即可但是注意的是还要提供用户名和密码)<br/>Private Function ConnectWmiServer(objSWbemServices As SWbemServices, ByVal strComputerName As String, Optional ByVal strNameSpace As String = "root/cimv2", Optional ByVal strUserName As String = "", Optional ByVal strPassWord As String = "") As Boolean<br/> Dim objSWbemLocator As SWbemLocator<br/> On Error GoTo errLine<br/> Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")<br/> '提升权限为DEBUG权限<br/> objSWbemLocator.Security_.Privileges.Add wbemPrivilegeDebug<br/> If strComputerName <> "." Then<br/> Set objSWbemServices = objSWbemLocator.ConnectServer(strComputerName, strNameSpace, strUserName, strPassWord)<br/> Else<br/> Set objSWbemServices = objSWbemLocator.ConnectServer()<br/> End If<br/> ConnectWmiServer = True<br/> Set objSWbemLocator = Nothing<br/> Exit Function<br/>errLine:<br/> ConnectWmiServer = False<br/> Set objSWbemLocator = Nothing<br/>End Function</font></p>
<p><font face="Verdana">'利用WMI创建进程<br/>Public Function UseWmiCreateProcess(ByVal strFile As String) As Long<br/> Dim objSWbemServices As SWbemServices, objSWbemObject As SWbemObject, processId As Long, errResult As Long<br/> '连接WMI服务<br/> If ConnectWmiServer(objSWbemServices, ".") Then<br/> '获取一个WMI实例<br/> Set objSWbemObject = objSWbemServices.Get("Win32_Process")<br/> '调用CREATE方法创建一进程<br/> errResult = objSWbemObject.Create(strFile, Null, Null, processId)<br/> '当成功则返回其PID<br/> If errResult <> 0 Then<br/> UseWmiCreateProcess = 0<br/> Else<br/> UseWmiCreateProcess = processId<br/> End If<br/> Else<br/> MessageBox 0, "连接不到WMI服务!!", "错误", vbCritical<br/> End If<br/> '释放内存<br/> SetObjectNothing objSWbemServices<br/> SetObjectNothing objSWbemObject<br/>End Function</font></p>
<p><font face="Verdana">Private Sub StartMonitorCreateProcessEvent()<br/> '执行进程创建事件<br/> Dim objSWbemServices As SWbemServices<br/> If ConnectWmiServer(objSWbemServices, ".") Then<br/> Set CreateProcessEvent = New SWbemSink<br/> 'Set objSWbemServices = GetObject("winmgmts:\\.\root\cimv2")<br/> objSWbemServices.ExecNotificationQueryAsync CreateProcessEvent, "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'"<br/> Else<br/> MessageBox 0, "连接不到WMI服务!!", "错误", vbCritical<br/> End If<br/> SetObjectNothing objSWbemServices<br/>End Sub</font></p>
<p><font face="Verdana">Private Sub StartMonitorDeleteProcessEvent()<br/> '执行进程结束事件<br/> Dim objSWbemServices As SWbemServices<br/> If ConnectWmiServer(objSWbemServices, ".") Then<br/> Set DeleteProcessEvent = New SWbemSink<br/> 'Set objSWbemServices = GetObject("winmgmts:\\.\root\cimv2")<br/> objSWbemServices.ExecNotificationQueryAsync DeleteProcessEvent, "SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'"<br/> Else<br/> MessageBox 0, "连接不到WMI服务!!", "错误", vbCritical<br/> End If<br/> SetObjectNothing objSWbemServices<br/>End Sub</font></p>
<p><font face="Verdana">Private Sub StartMonitorModificationProcessEvent()<br/> '执行进程属性变更事件<br/> Dim objSWbemServices As SWbemServices<br/> If ConnectWmiServer(objSWbemServices, ".") Then<br/> Set ModificationProcessEvent = New SWbemSink<br/> 'Set objSWbemServices = GetObject("winmgmts:\\.\root\cimv2")<br/> objSWbemServices.ExecNotificationQueryAsync ModificationProcessEvent, "SELECT * FROM __InstanceModificationEvent WITHIN 5 WHERE TargetInstance ISA 'Win32_Process'"<br/> Else<br/> MessageBox 0, "连接不到WMI服务!!", "错误", vbCritical<br/> End If<br/> SetObjectNothing objSWbemServices<br/>End Sub</font></p>
<p><font face="Verdana">'进程创建事件<br/>Private Sub CreateProcessEvent_OnObjectReady(ByVal objWbemObject As WbemScripting.ISWbemObject, ByVal objWbemAsyncContext As WbemScripting.ISWbemNamedValueSet)<br/> '当有进程创建了则添加信息到LISTVIEW中<br/> Dim lvItem As ListItem, lgWorkingSetSize As Long<br/> Dim processUserName As String, processPath As String<br/> '添加进程名到LISTVIEW中<br/> Set lvItem = Me.lvProcessexInfo.ListItems.Add(, , objWbemObject.Properties_.Item("TargetInstance").Value.Properties_.Item("Name").Value)<br/> '添加进程PID到LISTVIEW中<br/> lvItem.SubItems(1) = objWbemObject.Properties_.Item("TargetInstance").Value.Properties_.Item("ProcessID").Value<br/> '添加进程用户名到LISTVIEW中<br/> processUserName = GetProcessUserNameByProcessID(objWbemObject.Properties_.Item("TargetInstance").Value.Properties_.Item("ProcessID").Value)<br/> lvItem.SubItems(2) = processUserName<br/> '添加进程使用的内存到LISTVIEW中<br/> lvItem.SubItems(3) = CStr(CLng(objWbemObject.Properties_.Item("TargetInstance").Value.Properties_.Item("WorkingSetSize").Value) \ 1024) & "K"<br/> '添加进程路径到LISTVIEW中<br/> If IsNull(objWbemObject.Properties_.Item("TargetInstance").Value.Properties_.Item("CommandLine")) Then<br/> If IsNull(objWbemObject.Properties_.Item("TargetInstance").Value.Properties_.Item("ExecutablePath")) Then<br/> processPath = ""<br/> Else<br/> processPath = objWbemObject.Properties_.Item("TargetInstance").Value.Properties_.Item("ExecutablePath")<br/> End If<br/> Else<br/> If Len(objWbemObject.Properties_.Item("TargetInstance").Value.Properties_.Item("ExecutablePath")) > Len(objWbemObject.Properties_.Item("TargetInstance").Value.Properties_.Item("CommandLine")) Then<br/> processPath = objWbemObject.Properties_.Item("TargetInstance").Value.Properties_.Item("ExecutablePath")<br/> Else<br/> processPath = objWbemObject.Properties_.Item("TargetInstance").Value.Properties_.Item("CommandLine")<br/> End If<br/> End If<br/> lvItem.SubItems(4) = Replace(processPath, """", "")<br/> processPath = objWbemObject.Properties_.Item("TargetInstance").Value.Properties_.Item("ExecutablePath").Value<br/> imgProcessList.ListImages.Add , "H" & objWbemObject.Properties_.Item("TargetInstance").Value.Properties_.Item("ProcessID").Value, GetIcon(processPath)<br/> lvItem.smallIcon = imgProcessList.ListImages.Item("H" & objWbemObject.Properties_.Item("TargetInstance").Value.Properties_.Item("ProcessID").Value).Key<br/> lgWorkingSetSize = (Val(objWbemObject.Properties_.Item("TargetInstance").Value.Properties_.Item("WorkingSetSize").Value) / 1024) / 1024<br/> statusMsg.Panels.Item(1).Text = "进程数: " & CStr(Mid(statusMsg.Panels.Item(1).Text, 5, Len(statusMsg.Panels.Item(1).Text) - 4) + 1)<br/> statusMsg.Panels.Item(2).Text = "内存使用: " & Mid(statusMsg.Panels.Item(2).Text, 6, Len(statusMsg.Panels.Item(2).Text) - 6) + lgWorkingSetSize & "M"<br/> SetObjectNothing lvItem<br/>End Sub</font></p>
<p><font face="Verdana">'获取进程用户名函数<br/>Private Function GetProcessUserNameByProcessID(ByVal processId As String) As String<br/> Dim objSWbemServices As SWbemServices, objWbemObjectSet As SWbemObjectSet, objWbemObject As SWbemObject<br/> '连接WMI服务<br/> If ConnectWmiServer(objSWbemServices, ".") Then<br/> Set objWbemObjectSet = objSWbemServices.ExecQuery("Select * From Win32_Process Where ProcessID=" & processId)<br/> For Each objWbemObject In objWbemObjectSet<br/> '获取进程用户名称(通过进程中的GetOwner函数<br/> GetProcessUserNameByProcessID = objWbemObject.ExecMethod_("GetOwner").Properties_("User")<br/> Next<br/> Else<br/> MessageBox 0, "连接不到WMI服务!!", "错误", vbCritical<br/> End If<br/> '释放内存<br/> SetObjectNothing objSWbemServices<br/> SetObjectNothing objWbemObjectSet<br/> SetObjectNothing objWbemObject<br/>End Function</font></p>
<p><font face="Verdana">'进程退出事件<br/>Private Sub DeleteProcessEvent_OnObjectReady(ByVal objWbemObject As WbemScripting.ISWbemObject, ByVal objWbemAsyncContext As WbemScripting.ISWbemNamedValueSet)<br/> '当有进程结束了则查找LISTVIEW对应项并且删除它<br/> Dim lvItem As ListItem, lgWorkingSetSize As Long<br/> Set lvItem = Me.lvProcessexInfo.FindItem(objWbemObject.Properties_.Item("TargetInstance").Value.Properties_.Item("ProcessID"), lvwSubItem, , lvwPartial)<br/> Me.lvProcessexInfo.ListItems.Remove lvItem.Index<br/> '更新进程数<br/> statusMsg.Panels.Item(1).Text = "进程数: " & CStr(Mid(statusMsg.Panels.Item(1).Text, 5, Len(statusMsg.Panels.Item(1).Text) - 4) - 1)<br/> '更新内存使用率<br/> lgWorkingSetSize = (Val(objWbemObject.Properties_.Item("TargetInstance").Value.Properties_.Item("WorkingSetSize").Value) / 1024) / 1024<br/> statusMsg.Panels.Item(2).Text = "内存使用: " & Mid(statusMsg.Panels.Item(2).Text, 6, Len(statusMsg.Panels.Item(2).Text) - 6) - lgWorkingSetSize & "M"<br/> SetObjectNothing lvItem<br/>End Sub</font></p>
<p><font face="Verdana">Private Sub Form_Resize()<br/> On Error Resume Next<br/> Me.lvProcessexInfo.Width = Me.Width - 340<br/> Me.lvProcessexInfo.Height = Me.Height - 1760<br/> Me.cmdAbout.Top = Me.lvProcessexInfo.Height + 500<br/> Me.cmdExit.Top = Me.cmdAbout.Top<br/> Me.cmdKill.Top = Me.cmdAbout.Top<br/> Me.cmdRun.Top = Me.cmdAbout.Top<br/> Me.cmdExit.Left = Me.Width - 220 - Me.cmdExit.Width<br/> Me.cmdRun.Left = Me.cmdExit.Left - Me.cmdExit.Width - 140<br/> Me.cmdKill.Left = Me.cmdRun.Left - Me.cmdRun.Width - 140<br/> Me.cmdAbout.Left = Me.cmdKill.Left - Me.cmdKill.Width - 140<br/>End Sub</font></p>
<p><font face="Verdana">Private Sub Form_Unload(Cancel As Integer)<br/> Dim i As Integer<br/> Call SetWindowLong(Me.hwnd, GWL_WNDPROC, OldWindowProc)<br/> For i = Forms.Count - 1 To 1 Step -1<br/> Unload Forms(i)<br/> Next<br/> End<br/>End Sub</font></p>
<p><font face="Verdana">'进程属性变更事件<br/>Private Sub ModificationProcessEvent_OnObjectReady(ByVal objWbemObject As WbemScripting.ISWbemObject, ByVal objWbemAsyncContext As WbemScripting.ISWbemNamedValueSet)<br/> '主要是监视内存的变化<br/> On Error Resume Next<br/> Dim lvItem As ListItem, lgWorkingSetSize As Long<br/> Set lvItem = Me.lvProcessexInfo.FindItem(objWbemObject.Properties_.Item("TargetInstance").Value.Properties_.Item("ProcessID"), lvwSubItem, , lvwPartial)<br/> '算出实时内存使用情况(也可以用GetWorkingSetSize函数,但是这个显得科学些)<br/> lgWorkingSetSize = Left(lvItem.SubItems(3), Len(lvItem.SubItems(3)) - 1)<br/> lgWorkingSetSize = CInt((objWbemObject.Properties_.Item("TargetInstance").Value.Properties_.Item("WorkingSetSize").Value / 1024 - lgWorkingSetSize) / 1024)<br/> lvItem.SubItems(3) = CStr(Val(objWbemObject.Properties_.Item("TargetInstance").Value.Properties_.Item("WorkingSetSize").Value) / 1024) & "K"<br/> statusMsg.Panels.Item(2).Text = "内存使用: " & Mid(statusMsg.Panels.Item(2).Text, 6, Len(statusMsg.Panels.Item(2).Text) - 6) + lgWorkingSetSize & "M"<br/> SetObjectNothing lvItem<br/>End Sub</font></p></div>本帖来源:<font face="Verdana">http://www.superkill.cn/bbs/dispbbs.asp?boardid=2&Id=6</font></div></td></tr></tbody></table> |
|