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)