用于监视任务管理器

时间:2016-09-27 07:04:20

标签: excel vba excel-vba vbscript macros

监视任务管理器中显示的Windows进程的VBA代码。

我正在尝试获取应用程序的RAM使用率和CPU使用率,并在excel中添加这些值。

我尝试使用WMI类,如下所示但是我正在获取进程ID。我无法检索RAM使用率和CPU使用率。 任何人都可以帮助我吗?

Sub test2()
    Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
    Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Process where caption='excel.exe'", , 48)
    For Each objItem In colItems
        Sheet1.Range("d2").Value = objItem.ProcessId
    Next

    Set colItems = objWMIService.ExecQuery( _"SELECT * FROM Win32_PerfFormattedData_PerfProc_Process where IDProcess=" & Sheet1.Range("d2").Value, , 48)

    For Each objItem In colItems
        Sheet1.Range("A1").Value = "PercentProcessorTime: " & objItem.PercentProcessorTime
    Next

End Sub

2 个答案:

答案 0 :(得分:0)

如果您选择转到WMI路由,那么您可能会在Win32_Process类的WorkingSetSize属性之后:

  

WorkingSetSize数据类型:uint64访问类型:只读限定符:   DisplayName("工作集大小"),单位("字节")内存量   进程需要高效执行的字节 - 用于操作   使用基于页面的内存管理的系统。如果系统没有   有足够的内存(小于工作集大小),发生颠簸。   如果未知工作集的大小,请使用NULL或0(零)。如果   提供工作集数据,可以监控信息   了解流程的内存需求变化。

Win32_PerfFormattedData_PerfProc_Process类的PercentProcessorTime

  

PercentProcessorTime数据类型:uint64访问类型:只读   限定符:CookingType(" PERF_100NSEC_TIMER"),计数器   (" PercentProcessorTime"),PerfTimeStamp(" TimeStamp_Sys100NS"),   PerfTimeFreq(" Frequency_Sys100NS")时间的百分比   处理器正在执行非空闲线程。这个属性是设计的   作为处理器活动的主要指标。它的计算方法是   测量处理器执行线程的时间   每个采样间隔中的空闲进程,并减去该值   从100%。 (每个处理器都有一个消耗周期的空闲线程   当没有其他线程准备好运行时。)它可以被视为   做有用工作所花费的样本间隔百分比。这个   property显示在此期间观察到的繁忙时间的平均百分比   采样间隔。它是通过监测时间来计算的   服务处于非活动状态,然后从100%中减去该值。

但您可能还想查看SWbemRefresher对象(https://msdn.microsoft.com/en-us/library/aa393838(v=vs.85).aspx)。

您可以使用的Skeleton VBA代码:

Dim srvEx As SWbemServicesEx
Dim xlProcSet As SWbemObjectSet
Dim xlPerfSet As SWbemObjectSet
Dim objEx As SWbemObjectEx

Set srvEx = GetObject("winmgmts:\\.\root\CIMV2")
Set xlProcSet = srvEx.ExecQuery("SELECT * FROM Win32_Process WHERE name = 'EXCEL.EXE'")
Set xlPerfSet = srvEx.ExecQuery("SELECT * FROM Win32_PerfFormattedData_PerfProc_Process WHERE name = 'EXCEL'")

For Each objEx In xlProcSet
    Debug.Print objEx.Name & " RAM: " & objEx.WorkingSetSize / 1024 & "kb"
Next

For Each objEx In xlPerfSet
    Debug.Print objEx.Name & " CPU: " & objEx.PercentProcessorTime & "%"
Next

答案 1 :(得分:0)

这些功能允许根据要求监视RAM和CPU使用情况。请注意,其中一个应用程序名称区分大小写并包含扩展名,另一个应用程序名称不区分大小写且不包含扩展名。

Debug.Print ProcessCpuUsage("Excel")
Debug.Print ProcessMemoryUsage("EXCEL.EXE") / 1024

Function ProcessCpuUsage(ProcessName As String) As Double
  Dim Wmi As Object, Processes As Variant, Process As Object
  Set Wmi = GetObject("winmgmts:")
  Set Processes = Wmi.ExecQuery("SELECT PercentProcessorTime FROM win32_PerfFormattedData_PerfProc_Process WHERE Name='" & ProcessName & "'")
  For Each Process In Processes
    Exit For
  Next Process
  ProcessCpuUsage = Process.PercentProcessorTime
End Function

Function ProcessMemoryUsage(ProcessName As String) As Double
  Dim Wmi As Object, Processes As Variant, Process As Object
  Set Wmi = GetObject("winmgmts:")
  Set Processes = Wmi.ExecQuery("SELECT WorkingSetSize FROM Win32_Process WHERE Name='" & ProcessName & "'")
  For Each Process In Processes
    Exit For
  Next Process
  ProcessMemoryUsage = Process.WorkingSetSize
End Function