| 
| 
| 
| #90295 - 2002-12-04 06:39 PM  beta - KiXforms: ProcessMon |  
| Chris S.   MM club member
 
       
   Registered:  2002-03-18
 Posts: 2368
 Loc:  Earth
 | 
I've been developing this script (rather slowly) for a while now and I thought it was time to solicit some feedback.
 It uses WMI to monitor processes and report back some of the raw data in a nice little GUI. The look and feel is complete ripped off of Task Manager.
 
 Anyway, I was just looking for some response on how useful this might be and what features or changes should be made.
 
 Thanks...
 
 Screen Shots:
 
 
   
 
   
 Code:
 
 Break On
 ;---------------------------------------------------------------------------
 ; Process Listing Form
 ;---------------------------------------------------------------------------
 $frmProcesses = CreateObject("Kixtart.Form")
 $frmProcesses.Size = 400,350
 $frmProcesses.Text = "Process List"
 $frmProcesses.FontName = "Veranda"
 
 $lvwProcessList = $frmProcesses.ListView()
 $lvwProcessList.Left = 5
 $lvwProcessList.Top = 10
 $lvwProcessList.Width = $frmProcesses.ClientWidth - 10
 $lvwProcessList.Bottom = $frmProcesses.ClientHeight - 35
 $lvwProcessList.FullRowSelect = True
 $lvwProcessList.Sorted = 1
 
 $nul = $lvwProcessList.Columns.Add("Process Name",130)
 $nul = $lvwProcessList.Columns.Add("PID",54,1)
 $nul = $lvwProcessList.Columns.Add("CPU Time",90,1)
 $nul = $lvwProcessList.Columns.Add("Mem Usage",90,1)
 
 $cboComputer = $frmProcesses.ComboBox(,20,30,200)
 $cboComputer.Top = $lvwProcessList.Bottom + 5
 $cboComputer.Left = 5
 $cboComputer.Additem (@WKSTA)
 $cboComputer.Value = "@WKSTA"
 $cboComputer.Sorted = 1
 
 $btnListProcesses = $frmProcesses.Button
 $btnListProcesses.Text = "Refresh"
 $btnListProcesses.Top = $lvwProcessList.Bottom + 5
 $btnListProcesses.Left = $cboComputer.Right + 5
 $btnListProcesses.Size = 60,25
 $btnListProcesses.OnClick = "$$nul=fnGetProcessList($$cboComputer.Value)"
 $btnListProcesses.ToolTip = "Refresh the process listing"
 
 $btnMonProcess = $frmProcesses.Button
 $btnMonProcess.Text = "Monitor"
 $btnMonProcess.Top = $lvwProcessList.Bottom + 5
 $btnMonProcess.Left = $btnListProcesses.Right + 5
 $btnMonProcess.Size = 60,25
 $btnMonProcess.OnClick = "$$nul=fnMonProcess()"
 $btnMonProcess.ToolTip = "Monitor the currently selected process"
 
 ;---------------------------------------------------------------------------
 ; Process Monitor Form
 ;---------------------------------------------------------------------------
 $frmProcess = CreateObject("Kixtart.Form")
 $frmProcess.Size = 420,300
 $frmProcess.Topmost = True
 $frmProcess.Text = "Monitoring Process"
 $frmProcess.FontName = "Veranda"
 $frmProcess.MinButton = 1
 
 $fraCPUUsage = $frmProcess.GroupBox
 $fraCPUUsage.Size = 80,80
 $fraCPUUsage.Text = "CPU Usage"
 $fraCPUUsage.Top = 5
 $fraCPUUsage.Left = 5
 
 $picCPUUsage = $fraCPUUsage.PictureBox
 $picCPUUsage.ScaleHeight = 51
 $picCPUUsage.Width = 60
 $picCPUUsage.BackColor = Black
 $picCPUUsage.Top = 15
 $picCPUUsage.Left = 10
 
 $prgCPUUsage = $picCPUUsage.ProgressBar
 $prgCPUUsage.Height = 30
 $prgCPUUsage.Width = 30
 $prgCPUUsage.Center
 $prgCPUUsage.Top = 5
 $prgCPUUsage.ForeColor = Lawngreen
 $prgCPUUsage.BackColor = Black
 $prgCPUUsage.BorderStyle = 1
 $prgCPUUsage.Orientation = 1
 $prgCPUUsage.Style = 1
 $prgCPUUsage.Max = 100
 
 $lblCPUUsage = $picCPUUsage.Label
 $lblCPUUsage.Height = 15
 $lblCPUUsage.Width = 28
 $lblCPUUsage.Center
 $lblCPUUsage.Top = $prgCPUUsage.Bottom
 $lblCPUUsage.ForeColor = Lawngreen
 $lblCPUUsage.BackColor = Black
 $lblCPUUsage.BorderStyle = 1
 $lblCPUUsage.Alignment = 1
 $lblCPUUsage.Text = "%"
 $lblCPUUsage.FontName = "Lucida Console"
 $lblCPUUsage.FontSize = 8
 
 $fraCPUHist = $frmProcess.GroupBox
 $fraCPUHist.Size = 320,80
 $fraCPUHist.Text = "CPU Usage History"
 $fraCPUHist.Top = 5
 $fraCPUHist.Left = $fraCPUUsage.Right + 5
 
 $picCPUHist = $fraCPUHist.PictureBox
 $picCPUHist.ScaleHeight = 51
 $picCPUHist.ScaleWidth = 300
 $picCPUHist.BackColor = Black
 $picCPUHist.Top = 15
 $picCPUHist.Left = 10
 
 $fraMEMUsage = $frmProcess.GroupBox
 $fraMEMUsage.Size = 80,80
 $fraMEMUsage.Text = "MEM Usage"
 $fraMEMUsage.Top = $fraCPUUsage.Bottom
 $fraMEMUsage.Left = 5
 
 $picMEMUsage = $fraMEMUsage.PictureBox
 $picMEMUsage.ScaleHeight = 51
 $picMEMUsage.Width = 60
 $picMEMUsage.BackColor = Black
 $picMEMUsage.Top = 15
 $picMEMUsage.Left = 10
 
 $prgMEMUsage = $picMEMUsage.ProgressBar
 $prgMEMUsage.Height = 30
 $prgMEMUsage.Width = 30
 $prgMEMUsage.Center
 $prgMEMUsage.Top = 5
 $prgMEMUsage.ForeColor = Lawngreen
 $prgMEMUsage.BackColor = Black
 $prgMEMUsage.BorderStyle = 1
 $prgMEMUsage.Orientation = 1
 $prgMEMUsage.Style = 1
 $prgMEMUsage.Max = 100
 
 $lblMEMUsage = $picMEMUsage.Label
 $lblMEMUsage.Height = 15
 $lblMEMUsage.Width = 50
 $lblMEMUsage.Center
 $lblMEMUsage.Top = $prgMEMUsage.Bottom
 $lblMEMUsage.ForeColor = Lawngreen
 $lblMEMUsage.BackColor = Black
 $lblMEMUsage.BorderStyle = 1
 $lblMEMUsage.Alignment = 2
 $lblMEMUsage.FontName = "Lucida Console"
 $lblMEMUsage.FontSize = 8
 
 $fraMEMHist = $frmProcess.GroupBox
 $fraMEMHist.Size = 320,80
 $fraMEMHist.Text = "MEM Usage History"
 $fraMEMHist.Top = $fraCPUHist.Bottom
 $fraMEMHist.Left = $fraMEMUsage.Right + 5
 
 $picMEMHist = $fraMEMHist.PictureBox
 $picMEMHist.ScaleHeight = 51
 $picMEMHist.ScaleWidth = 300
 $picMEMHist.BackColor = Black
 $picMEMHist.Top = 15
 $picMEMHist.Left = 10
 
 $fraTotals = $frmProcess.GroupBox
 $fraTotals.Size = 200,80
 $fraTotals.Text = "Totals"
 $fraTotals.Top = $fraMEMHist.Bottom
 $fraTotals.Left = $fraMEMUsage.Left
 
 $lblHandles = $fraTotals.Label
 $lblHandles.Size = 80,15
 $lblHandles.Top = 15
 $lblHandles.Left = 10
 $lblHandles.Text = "Handles"
 
 $lblHandlesCount = $fraTotals.Label
 $lblHandlesCount.Size = 80,15
 $lblHandlesCount.Top = $lblHandles.Top
 $lblHandlesCount.Left = $lblHandles.Right + 20
 $lblHandlesCount.Alignment = 1
 
 $lblThreads = $fraTotals.Label
 $lblThreads.Size = 80,15
 $lblThreads.Top = $lblHandles.Bottom
 $lblThreads.Left = $lblHandles.Left
 $lblThreads.Text = "Threads"
 
 $lblThreadsCount = $fraTotals.Label
 $lblThreadsCount.Size = 80,15
 $lblThreadsCount.Top = $lblThreads.Top
 $lblThreadsCount.Left = $lblThreads.Right + 20
 $lblThreadsCount.Alignment = 1
 
 $lblElapsedTime = $fraTotals.Label
 $lblElapsedTime.Size = 80,15
 $lblElapsedTime.Top = $lblThreads.Bottom
 $lblElapsedTime.Left = $lblThreads.Left
 $lblElapsedTime.Text = "Elapsed Time"
 
 $lblElapsedTimeCount = $fraTotals.Label
 $lblElapsedTimeCount.Size = 80,15
 $lblElapsedTimeCount.Top = $lblElapsedTime.Top
 $lblElapsedTimeCount.Left = $lblElapsedTime.Right + 20
 $lblElapsedTimeCount.Alignment = 1
 
 $fraOperations = $frmProcess.GroupBox
 $fraOperations.Size = 200,80
 $fraOperations.Text = "Data Operations"
 $fraOperations.Top = $fraTotals.Top
 $fraOperations.Left = $fraTotals.Right +5
 
 $lblDataPerSec = $fraOperations.Label("Data Bytes/Sec",10,15,90,15)
 $lblDataPerSecCount = $fraOperations.Label("",$lblDataPerSec.Right+20,$lblDataPerSec.Top,70,15)
 $lblDataPerSecCount.Alignment = 1
 
 $lblReadsPerSec = $fraOperations.Label("Read Bytes/Sec",10,$lblDataPerSec.Bottom,90,15)
 $lblReadsPerSecCount = $fraOperations.Label("",$lblReadsPerSec.Right+20,$lblReadsPerSec.Top,70,15)
 $lblReadsPerSecCount.Alignment = 1
 
 $lblWritesPerSec = $fraOperations.Label("Write Bytes/Sec",10,$lblReadsPerSec.Bottom,90,15)
 $lblWritesPerSecCount = $fraOperations.Label("",$lblWritesPerSec.Right+20,$lblWritesPerSec.Top,70,15)
 $lblWritesPerSecCount.Alignment = 1
 
 ;---------------------------------------------------------------------------
 ; Start Application
 ;---------------------------------------------------------------------------
 fnGetProcessList($cboComputer.Value)
 $frmProcesses.Center
 $frmProcesses.Show
 
 While $frmProcesses.Visible
 $nul=Execute($frmProcesses.DoEvents)
 Loop
 
 $objWMIService=""
 Exit(1)
 
 ;---------------------------------------------------------------------------
 ; Functions
 ;---------------------------------------------------------------------------
 Function fnGetProcessList(Optional $sComputer)
 If $sComputer="" $sComputer = "." EndIf
 $frmProcesses.Text = "Process List for "+$sComputer
 $frmProcesses.MousePointer = 11
 $lvwProcessList.Items.Clear
 $lvwProcessList.BeginUpdate
 $objWMIService = GetObject("winmgmts:\\"+$sComputer+"\root\cimv2")
 If @ERROR $nul = $frmProcesses.MsgBox(@SERROR,"Error",16) $frmProcesses.MousePointer=0 Exit(1) EndIf
 $colItems = $objWMIService.ExecQuery("Select * from Win32_Process",,48)
 For each $objItem in $colItems
 $Item=$lvwProcessList.Items.Add($objItem.Name)
 $Item.SubItems(1).Text=$objItem.ProcessID
 $Item.SubItems(2).Text=fnSecondsToHMMSS(CInt((CDbl($objItem.UserModeTime)
 +CDbl($objItem.KernelModeTime))/10000000))
 $Item.SubItems(3).Text=""+FormatNumber(CDbl($objItem.WorkingSetSize)/1024,0)+" K"
 Next
 $frmProcesses.MousePointer=0
 $lvwProcessList.EndUpdate
 EndFunction
 
 Function fnMonProcess()
 $frmProcesses.Hide
 fnDrawGrid()
 $frmProcess.Center
 $frmProcess.Show
 
 For Each $Item in $lvwProcessList.SelectedItems
 $sProcess=$Item.SubItems(0).Text
 $sPID=$Item.SubItems(1).Text
 Next
 
 $colItems = $objWMIService.ExecQuery("Select * from Win32_LogicalMemoryConfiguration",,48)
 For each $objItem in $colItems
 $lMEMMax=CDbl($objItem.TotalPageFileSpace)
 ;"TotalPhysicalMemory: " + $objItem.TotalPhysicalMemory
 Next
 
 $objProcess = $objWMIService.ExecQuery("Select * from Win32_PerfRawData_PerfProc_Process "
 +'WHERE IDProcess = $sPID AND Name <> "_Total"',,48)
 For Each $objItem in $objProcess
 $frmProcess.Caption="Monitoring "+$sProcess+" (PID: "+$objItem.IDProcess+") on "
 +$cboComputer.Value
 Next
 
 $prgCPUUsage.Refresh
 $prgMEMUsage.Refresh
 $tl=-6
 :MonitorLoop
 For $x = $tl to $picCPUHist.ScaleWidth step 5
 $objProcess = $objWMIService.ExecQuery("Select * from Win32_PerfRawData_PerfProc_Process "
 +'WHERE IDProcess = $sPID AND Name <> "_Total"',,48)
 For Each $objItem in $objProcess
 $sProcessName=$objItem.Name
 $dP2=CDbl($objItem.PercentProcessorTime)
 $dT2=CDbl($objItem.Timestamp_Sys100NS)
 $prgMEMUsage.Value=Int(CDBL($objItem.WorkingSet)/1024/$lMEMMax*100)
 $lblMEMUsage.Text=CDBL($objItem.WorkingSet)/1024
 $lblHandlesCount.Text = $objItem.HandleCount
 $lblThreadsCount.Text = $objItem.ThreadCount
 $lblElapsedTimeCount.Text = fnSecondsToHMMSS(CInt((CDbl($objItem.Timestamp_Object)
 -CDbl($objItem.ElapsedTime))/CDbl($objItem.Frequency_Object)))
 $xDO2=CDbl($objItem.IODataBytesPerSec)
 $xRO2=CDbl($objItem.IOReadBytesPerSec)
 $xWO2=CDbl($objItem.IOWriteBytesPerSec)
 $yDO2=CDbl($objItem.Timestamp_PerfTime)
 Next
 $lCPercent=Fix((($dP2-$dP1) / ($dT2-$dT1))*100)
 If $lCPercent>100 $lCPercent=100 EndIf
 
 $prgCPUUsage.Value = $lCPercent
 $lblCPUUsage.Text = ""+$lCPercent+"%"
 $yM2=50-$prgMEMUsage.Value/2
 $yC2=50-$lCPercent/2
 
 $picMEMHist.Line($x,$yM1,$x+5,$yM2)
 $picCPUHist.Line($x,$yC1,$x+5,$yC2)
 ;Debug On
 $lblDataPerSecCount.Caption = FormatNumber(Int(($xDO2-$xDO1)/(($yDO2-$yDO1)/3579545)),0)
 $lblReadsPerSecCount.Caption = FormatNumber(Int(($xRO2-$xRO1)/(($yDO2-$yDO1)/3579545)),0)
 $lblWritesPerSecCount.Caption = FormatNumber(Int(($xWO2-$xWO1)/(($yDO2-$yDO1)/3579545)),0)
 ;Debug Off
 
 If Not $frmProcess.Visible or $sProcessName=''
 $frmProcess.Hide $frmProcesses.Show fnGetProcessList($cboComputer.Value) Exit()
 EndIf
 $yM1=$yM2 $yC1=$yC2 $dP1=$dP2 $dT1=$dT2 $xDO1=$xDO2 $xRO1=$xRO2 $xWO1=$xWO2 $yDO1=$yDO2
 $sProcessName=''
 Sleep 0.5
 Next
 fnDrawGrid() $tl=0
 Goto "MonitorLoop"
 EndFunction
 
 Function fnDrawGrid()
 $picCPUHist.Clear
 $picMEMHist.Clear
 $picCPUHist.ForeColor = Green
 $picMEMHist.ForeColor = Green
 For $y=10 to $picCPUHist.ScaleHeight step 10
 $picCPUHist.Line(0,$y,$picCPUHist.ScaleWidth,$y)
 $picMEMHist.Line(0,$y,$picMEMHist.ScaleWidth,$y)
 Next
 For $x=-11 to $picCPUHist.ScaleWidth step 10
 $picCPUHist.Line($x,0,$x,$picCPUHist.ScaleWidth)
 $picMEMHist.Line($x,0,$x,$picMEMHist.ScaleWidth)
 Next
 $picCPUHist.ForeColor = Lawngreen
 $picMEMHist.ForeColor = Lawngreen
 EndFunction
 
 Function fnSecondsToHMMSS($lSeconds)
 If Not VarType($lSeconds)=3 $fnSecondsToHMMSS="Invalid VarType: "+VarType($lSeconds) Exit(1) EndIf
 If $lSeconds < 0 $fnSecondsToHMMSS="Error" Exit(1) EndIf
 Select
 Case $lSeconds<60
 If $lSeconds<10 $lSeconds="0"+$lSeconds EndIf
 $fnSecondsToHMMSS="0:00:"+$lSeconds
 Case $lSeconds<3600
 $lMinutes=$lSeconds/60
 $lSeconds=$lSeconds-$lMinutes*60
 If $lMinutes<10 $lMinutes="0"+$lMinutes EndIf
 If $lSeconds<10 $lSeconds="0"+$lSeconds EndIf
 $fnSecondsToHMMSS="0:"+$lMinutes+":"+$lSeconds
 Case 1
 $lHours=$lSeconds/3600
 $lSeconds=$lSeconds-$lHours*3600
 $lMinutes=$lSeconds/60
 $lSeconds=$lSeconds-$lMinutes*60
 If $lMinutes<10 $lMinutes="0"+$lMinutes EndIf
 If $lSeconds<10 $lSeconds="0"+$lSeconds EndIf
 $fnSecondsToHMMSS=""+$lHours+":"+$lMinutes+":"+$lSeconds
 EndSelect
 EndFunction
 
 
 Edited by Shawn (2006-01-24 10:46 PM)
 |  
| Top |  |  |  |  
| 
| 
| #90301 - 2002-12-04 09:58 PM  Re: beta - KiXforms: ProcessMon |  
| Chris S.   MM club member
 
       
   Registered:  2002-03-18
 Posts: 2368
 Loc:  Earth
 | 
The CLS is just in there while I develop the script. It won't be a permanent fixture.
 As always, WKixers must remove the CLS to prevent the console window from appearing.
 ![[Wink]](images/icons/wink.gif)  |  
| Top |  |  |  |  
| 
| 
| #90303 - 2002-12-04 10:01 PM  Re: beta - KiXforms: ProcessMon |  
| Chris S.   MM club member
 
       
   Registered:  2002-03-18
 Posts: 2368
 Loc:  Earth
 | 
I don't think so. Actually, I think that would make a good item for the suggestion box.  ![[Smile]](images/icons/smile.gif)  |  
| Top |  |  |  |  
| 
| 
| #90304 - 2002-12-04 10:05 PM  Re: beta - KiXforms: ProcessMon |  
| Kdyer   KiX Supporter
 
       
   Registered:  2001-01-03
 Posts: 6241
 Loc:  Tigard, OR
 | 
Chris,
 Sweet code!
 
 A thought..  When you are looking at Mem Usage, PID, etc...  Can it change the sort order to show what processes are hogs?
 
 {Edit}
 Looks like just the PID and Mem Usage.
 {/Edit}
 
 Kent
 
 [ 04. December 2002, 22:07: Message edited by: kdyer ]
 |  
| Top |  |  |  |  
| 
| 
| #90308 - 2002-12-04 10:25 PM  Re: beta - KiXforms: ProcessMon |  
| Kdyer   KiX Supporter
 
       
   Registered:  2001-01-03
 Posts: 6241
 Loc:  Tigard, OR
 | 
Couple of more things..
 Monitoring a Domain Controller(2k) on the same Domain - Flashes back to the process list
 Monitoring a Domain Controller(2k) on a Child Domain - Works fine
 Could not Monitor local machine (XP), but process list works fine.
 
 Kent
 |  
| Top |  |  |  |  
| 
| 
| #90310 - 2002-12-05 06:53 AM  Re: beta - KiXforms: ProcessMon |  
| Kdyer   KiX Supporter
 
       
   Registered:  2001-01-03
 Posts: 6241
 Loc:  Tigard, OR
 | 
Yes..  at the time of the last post..
 Have not tried any updates.
 
 Kent
 |  
| Top |  |  |  |  
| 
| 
| #90311 - 2002-12-05 04:47 PM  Re: beta - KiXforms: ProcessMon |  
| Kdyer   KiX Supporter
 
       
   Registered:  2001-01-03
 Posts: 6241
 Loc:  Tigard, OR
 | 
ok..
 Status.
 
 Monitoring a Domain Controller(2k) on the same Domain - Flashes back to the process list
 Monitoring a Domain Controller(2k) on a Child Domain - Works fine
 Local machine (XP)works fine for both the Monitor and process list.
 
 Kent
 
 [ 05. December 2002, 16:47: Message edited by: kdyer ]
 |  
| Top |  |  |  |  
| 
| 
| #90313 - 2002-12-05 09:03 PM  Re: beta - KiXforms: ProcessMon |  
| Chris S.   MM club member
 
       
   Registered:  2002-03-18
 Posts: 2368
 Loc:  Earth
 | 
I'm using build 37. Still there.  ![[Wink]](images/icons/wink.gif)  |  
| Top |  |  |  |  
 Moderator:  Shawn, ShaneEP, Ruud van Velsen, Arend_, Jochen, Radimus, Glenn Barnas, Allen, Mart
 
 | 
| 
 
| 0 registered
and 793 anonymous users online. 
 | 
 |  |