【问题标题】:VBA code to monitor windows process displayed in task manager用于监视任务管理器中显示的 Windows 进程的 VBA 代码
【发布时间】:2016-09-27 07:04:19
【问题描述】:

用于监视任务管理器中显示的 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

【问题讨论】:

标签: excel vba macros wmi


【解决方案1】:

如果您选择走 WMI 路线,那么您可能在 Win32_Process 类的 WorkingSetSize 属性之后:

WorkingSetSize 数据类型:uint64 访问类型:只读限定符: DisplayName ("Working Set Size"), Units ("bytes") 中的内存量 进程需要有效执行的字节数——用于操作 使用基于页面的内存管理的系统。如果系统不 有足够的内存(小于工作集大小),就会发生抖动。 如果工作集的大小未知,请使用 NULL 或 0(零)。如果 提供工作集数据,可以监控信息到 了解进程不断变化的内存需求。

还有 Win32_PerfFormattedData_PerfProc_Process 类的PercentProcessorTime

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

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

供您使用的骨架 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

【讨论】:

  • 谢谢。我使用 WorkingSetSize 属性获得了内存使用情况,但仍在寻找 CPU 使用情况的属性。你的代码帮助了我。
【解决方案2】:

这些功能允许根据要求监控 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多