我希望得到就像任务管理器那样的CPU使用率,在网上看了很多,统计出来都是零或者有错,谢谢。

解决方案 »

  1.   

    How To Get % Processor Time Correctly By Using the Performance Data Helper (PDH) API
      

  2.   

    1.使用这个api   NtQuerySystemInformation
    2.直接读注册表   
      

  3.   

    我知道可以用WMI获取当前有百分之多少cpu和memory在使用,有多少个进程,但是不清楚可不可以查询出具体是哪些程序占用的cpu和memory,或许你可以查查WMI的classe和method。(http://msdn2.microsoft.com/en-us/library/aa389273(VS.85).aspx)
      

  4.   

    或者看看这个帖子,看有没有帮助:
    http://topic.csdn.net/u/20071217/11/7eb83a0e-3b94-4e8c-918d-2aa1dbd1baa5.html
      

  5.   

    俺刚回复了贴子,调用的API就可以了http://topic.csdn.net/u/20080227/22/d7cb638b-2aa9-4524-9d88-2cf1d616e397.html
      

  6.   

    Option ExplicitPrivate Const SYSTEM_BASICINFORMATION = 0&
    Private Const SYSTEM_PERFORMANCEINFORMATION = 2&
    Private Const SYSTEM_TIMEINFORMATION = 3&
    Private Const NO_ERROR = 0
    Private Type LARGE_INTEGER
        dwLow As Long
        dwHigh As Long
    End Type
    Private Type SYSTEM_BASIC_INFORMATION
        dwUnknown1 As Long
        uKeMaximumIncrement As Long
        uPageSize As Long
        uMmNumberOfPhysicalPages As Long
        uMmLowestPhysicalPage As Long
        uMmHighestPhysicalPage As Long
        uAllocationGranularity As Long
        pLowestUserAddress As Long
        pMmHighestUserAddress As Long
        uKeActiveProcessors As Long
        bKeNumberProcessors As Byte
        bUnknown2 As Byte
        wUnknown3 As Integer
    End Type
    Private Type SYSTEM_PERFORMANCE_INFORMATION
        liIdleTime As LARGE_INTEGER
        dwSpare(0 To 75) As Long
    End Type
    Private Type SYSTEM_TIME_INFORMATION
        liKeBootTime As LARGE_INTEGER
        liKeSystemTime As LARGE_INTEGER
        liExpTimeZoneBias  As LARGE_INTEGER
        uCurrentTimeZoneId As Long
        dwReserved As Long
    End Type
    Private Declare Function NtQuerySystemInformation Lib "ntdll" (ByVal dwInfoType As Long, ByVal lpStructure As Long, ByVal dwSize As Long, ByVal dwReserved As Long) As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
    Private liOldIdleTime As LARGE_INTEGER
    Private liOldSystemTime As LARGE_INTEGER
    Public Sub Initialize()
        Dim SysTimeInfo As SYSTEM_TIME_INFORMATION
        Dim SysPerfInfo As SYSTEM_PERFORMANCE_INFORMATION
        Dim Ret As Long
        'get new system time
        Ret = NtQuerySystemInformation(SYSTEM_TIMEINFORMATION, VarPtr(SysTimeInfo), LenB(SysTimeInfo), 0&)
        If Ret <> NO_ERROR Then
            Debug.Print "Error while initializing the system's time!", vbCritical
            Exit Sub
        End If
        'get new CPU's idle time
        Ret = NtQuerySystemInformation(SYSTEM_PERFORMANCEINFORMATION, VarPtr(SysPerfInfo), LenB(SysPerfInfo), ByVal 0&)
        If Ret <> NO_ERROR Then
            Debug.Print "Error while initializing the CPU's idle time!", vbCritical
            Exit Sub
        End If
        'store new CPU's idle and system time
        liOldIdleTime = SysPerfInfo.liIdleTime
        liOldSystemTime = SysTimeInfo.liKeSystemTime
    End Sub
    Public Function Query() As Long
        Dim SysBaseInfo As SYSTEM_BASIC_INFORMATION
        Dim SysPerfInfo As SYSTEM_PERFORMANCE_INFORMATION
        Dim SysTimeInfo As SYSTEM_TIME_INFORMATION
        Dim dbIdleTime As Currency
        Dim dbSystemTime As Currency
        Dim Ret As Long
        Query = -1
        'get number of processors in the system
        Ret = NtQuerySystemInformation(SYSTEM_BASICINFORMATION, VarPtr(SysBaseInfo), LenB(SysBaseInfo), 0&)
        If Ret <> NO_ERROR Then
            Debug.Print "Error while retrieving the number of processors!", vbCritical
            Exit Function
        End If
        'get new system time
        Ret = NtQuerySystemInformation(SYSTEM_TIMEINFORMATION, VarPtr(SysTimeInfo), LenB(SysTimeInfo), 0&)
        If Ret <> NO_ERROR Then
            Debug.Print "Error while retrieving the system's time!", vbCritical
            Exit Function
        End If
        'get new CPU's idle time
        Ret = NtQuerySystemInformation(SYSTEM_PERFORMANCEINFORMATION, VarPtr(SysPerfInfo), LenB(SysPerfInfo), ByVal 0&)
        If Ret <> NO_ERROR Then
            Debug.Print "Error while retrieving the CPU's idle time!", vbCritical
            Exit Function
        End If
        'CurrentValue = NewValue - OldValue
        dbIdleTime = LI2Currency(SysPerfInfo.liIdleTime) - LI2Currency(liOldIdleTime)
        dbSystemTime = LI2Currency(SysTimeInfo.liKeSystemTime) - LI2Currency(liOldSystemTime)
        'CurrentCpuIdle = IdleTime / SystemTime
        If dbSystemTime <> 0 Then dbIdleTime = dbIdleTime / dbSystemTime
        'CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors
        dbIdleTime = 100 - dbIdleTime * 100 / SysBaseInfo.bKeNumberProcessors + 0.5
        Query = Int(dbIdleTime)
        'store new CPU's idle and system time
        liOldIdleTime = SysPerfInfo.liIdleTime
        liOldSystemTime = SysTimeInfo.liKeSystemTime
    End Function