; 会生成test.txt文件记录信息
; https://www.autohotkey.com/boards/viewtopic.php?f=6&t=1395

#Persistent
#SingleInstance force
Run, calc.exe,,, pid1
Run, cmd.exe,,, pid2
arrPid := [ pid1, pid2 ]
nMsg := DllCall( "RegisterWindowMessage", Str,"AUTOHOTKEY_SYSPROCINFO_LIBRARY" )
OnMessage(nMsg, "AHKNOTIFY")
OnExit, Quit
SysProcInfo_ToggleTimer("START", 3, A_ScriptHwnd, nMsg, 1000, arrPid)
Return

Quit:
SysProcInfo_ToggleTimer("STOP")
ExitApp

AHKNOTIFY(wParam, lParam) {
    obj := Object(lParam)
    FileAppend, % "`n==="
                . "`nSystem Times: "               obj.SystemData.SystemTimes
                . "`nMemoryLoad: "                 obj.SystemData.MemoryLoad
                . "`nCommitTotal: "                obj.SystemData.CommitTotal
                . "`nCommitLimit: "                obj.SystemData.CommitLimit
                . "`nCommitPeak: "                 obj.SystemData.CommitPeak
                . "`nPhysicalTotal: "              obj.SystemData.PhysicalTotal
                . "`nPhysicalAvailable: "          obj.SystemData.PhysicalAvailable
                . "`nPhysicalUsed: "               obj.SystemData.PhysicalUsed
                . "`nSystemCache: "                obj.SystemData.SystemCache
                . "`nKernelTotal: "                obj.SystemData.KernelTotal
                . "`nKernelPaged: "                obj.SystemData.KernelPaged
                . "`nKernelNonpaged: "             obj.SystemData.KernelNonpaged
                . "`nPageSize: "                   obj.SystemData.PageSize
                . "`nHandleCount: "                obj.SystemData.HandleCount
                . "`nProcessCount: "               obj.SystemData.ProcessCount
                . "`nThreadCount: "                obj.SystemData.ThreadCount
                , test.txt
    FileAppend, % "`n---"
                . "`nPid: "                        obj.ProcData[1].Pid
                . "`nProcessTimes: "               obj.ProcData[1].ProcessTimes
                . "`nPageFaultCount: "             obj.ProcData[1].PageFaultCount
                . "`nPeakWorkingSetSize: "         obj.ProcData[1].PeakWorkingSetSize
                . "`nWorkingSetSize: "             obj.ProcData[1].WorkingSetSize
                . "`nQuotaPeakPagedPoolUsage: "    obj.ProcData[1].QuotaPeakPagedPoolUsage
                . "`nQuotaPagedPoolUsage: "        obj.ProcData[1].QuotaPagedPoolUsage
                . "`nQuotaPeakNonPagedPoolUsage: " obj.ProcData[1].QuotaPeakNonPagedPoolUsage
                . "`nQuotaNonPagedPoolUsage: "     obj.ProcData[1].QuotaNonPagedPoolUsage
                . "`nPagefileUsage: "              obj.ProcData[1].PagefileUsage 
                . "`nPeakPagefileUsage: "          obj.ProcData[1].PeakPagefileUsage
                . "`nReadOperationCount: "         obj.ProcData[1].ReadOperationCount
                . "`nWriteOperationCount: "        obj.ProcData[1].WriteOperationCount
                . "`nOtherOperationCount: "        obj.ProcData[1].OtherOperationCount
                . "`nReadTransferCount: "          obj.ProcData[1].ReadTransferCount
                . "`nWriteTransferCount: "         obj.ProcData[1].WriteTransferCount
                . "`nOtherTransferCount: "         obj.ProcData[1].OtherTransferCount
                . "`nCycleTime: "                  obj.ProcData[1].CycleTime
                . "`nHandleCount: "                obj.ProcData[1].HandleCount
                . "`nGdiHandles: "                 obj.ProcData[1].GdiHandles
                . "`nUserHandles: "                obj.ProcData[1].UserHandles
                . "`nPriorityClass: "              obj.ProcData[1].PriorityClass
                . "`n---"
                . "`nPid: "                        obj.ProcData[2].Pid
                . "`nProcessTimes: "               obj.ProcData[2].ProcessTimes
                . "`nPageFaultCount: "             obj.ProcData[2].PageFaultCount
                . "`nPeakWorkingSetSize: "         obj.ProcData[2].PeakWorkingSetSize
                . "`nWorkingSetSize: "             obj.ProcData[2].WorkingSetSize
                . "`nQuotaPeakPagedPoolUsage: "    obj.ProcData[2].QuotaPeakPagedPoolUsage
                . "`nQuotaPagedPoolUsage: "        obj.ProcData[2].QuotaPagedPoolUsage
                . "`nQuotaPeakNonPagedPoolUsage: " obj.ProcData[2].QuotaPeakNonPagedPoolUsage
                . "`nQuotaNonPagedPoolUsage: "     obj.ProcData[2].QuotaNonPagedPoolUsage
                . "`nPagefileUsage: "              obj.ProcData[2].PagefileUsage
                . "`nPeakPagefileUsage: "          obj.ProcData[2].PeakPagefileUsage
                . "`nReadOperationCount: "         obj.ProcData[2].ReadOperationCount
                . "`nWriteOperationCount: "        obj.ProcData[2].WriteOperationCount
                . "`nOtherOperationCount: "        obj.ProcData[2].OtherOperationCount
                . "`nReadTransferCount: "          obj.ProcData[2].ReadTransferCount
                . "`nWriteTransferCount: "         obj.ProcData[2].WriteTransferCount
                . "`nOtherTransferCount: "         obj.ProcData[2].OtherTransferCount
                . "`nCycleTime: "                  obj.ProcData[2].CycleTime
                . "`nHandleCount: "                obj.ProcData[2].HandleCount
                . "`nGdiHandles: "                 obj.ProcData[2].GdiHandles
                . "`nUserHandles: "                obj.ProcData[2].UserHandles
                . "`nPriorityClass: "              obj.ProcData[2].PriorityClass
                . "`n===`n"
                , test.txt
}

; ----------------------------------------------------------------------------------------------------------------------
; Name .........: SysProcInfo library
; Description ..: System and process performance information library.
; AHK Version ..: AHK_L 1.1.13.01 x32/64 Unicode
; Author .......: Cyruz (http://ciroprincipe.info) - Thanks to Sean & Laszlo.
; License ......: WTFPL - http://www.wtfpl.net/txt/copying/
; Changelog ....: Jan. 12, 2014 - v0.1 - First revision.
; ----------------------------------------------------------------------------------------------------------------------

; ----------------------------------------------------------------------------------------------------------------------
; Function .....: SysProcInfo_ToggleTimer
; Description ..: Sets itself as a timer and periodically call the library functions, returning the results as object.
; Parameters ...: aParams* is a variadic required to work with timers. Allowed parameters, to be passed in the following 
; ..............: strict sequential order, are:
; ..............: ACTION - Timer verb, can be "START" or "STOP". If "STOP" avoid the next parameters.
; ..............: MODE   - Requested info. Can be 1 for system, 2 for processes, 3 for both.
; ..............: HWND   - Handle of the window that will be notified.
; ..............: MSG    - Message that will be sent to the window to be notified.
; ..............: TIME   - Timer timeout.
; ..............: ARRPID - Array of PID of the processes we need info. Required only if MODE = 2 or = 3.
; Return .......: Nonzero on success, zero on error.
; ..............: -1 if the function is not called following the START -> STOP order convention.
; ..............: -2 if the wrong number of parameters is passed.
; ..............: -3 if the timer verb is different from "START" or "STOP".
; How to call ..: The function can be called in two ways, to start and stop the timer:
; ..............: 1. SysProcInfo_ToggleTimer("START", MODE, HWND, MSG, TIME, ARRPID)
; ..............: 2. SysProcInfo_ToggleTimer("STOP")
; How to use ...: Write a function to monitor MSG and receive notifications. The notification will be sent with the 
; ..............: following value of wParam/lParam:
; ..............: wParam - 0
; ..............: lParam - Object address, use "obj := Object(lParam)" to get a reference to the object.
; Remarks ......: The object structure is:
; ..............: obj.SystemData                            - Object containing system performance information.
; ..............: obj.SystemData.SystemTimes                - Percentage of total CPU Load.
; ..............: obj.SystemData.MemoryLoad                 - Percentage of physical memory in use.
; ..............: obj.SystemData.CommitTotal                - Number of pages currently committed by the system.
; ..............: obj.SystemData.CommitLimit                - Max number of pages that can be committed by the system.
; ..............: obj.SystemData.CommitPeak                 - Max number of pages committed since last reboot.
; ..............: obj.SystemData.PhysicalTotal              - The amount of actual physical memory, in pages.
; ..............: obj.SystemData.PhysicalAvailable          - The amount of available physical memory, in pages.
; ..............: obj.SystemData.PhysicalUsed               - The amount of used physical memory, in pages.
; ..............: obj.SystemData.SystemCache                - The amount of system cache memory, in pages.
; ..............: obj.SystemData.KernelTotal                - Memory in paged and nonpaged kernel pools, in pages.
; ..............: obj.SystemData.KernelPaged                - Memory currently in the paged kernel pool, in pages.
; ..............: obj.SystemData.KernelNonpaged             - Memory currently in the nonpaged kernel pool, in pages.
; ..............: obj.SystemData.PageSize                   - The size of a page, in bytes.
; ..............: obj.SystemData.HandleCount                - The current number of open handles.
; ..............: obj.SystemData.ProcessCount               - The current number of processes.
; ..............: obj.SystemData.ThreadCount                - The current number of threads.
; ..............: obj.ProcData[]                            - Array of objects containing processes performance info.
; ..............: obj.ProcData[].Pid                        - Process identifier.
; ..............: obj.ProcData[].ProcessTimes               - Process CPU Load Time.
; ..............: obj.ProcData[].PageFaultCount             - The number of page faults.
; ..............: obj.ProcData[].PeakWorkingSetSize         - The peak working set size, in bytes.
; ..............: obj.ProcData[].WorkingSetSize             - The current working set size, in bytes.
; ..............: obj.ProcData[].QuotaPeakPagedPoolUsage    - The peak paged pool usage, in bytes.
; ..............: obj.ProcData[].QuotaPagedPoolUsage        - The current paged pool usage, in bytes.
; ..............: obj.ProcData[].QuotaPeakNonPagedPoolUsage - The peak nonpaged pool usage, in bytes.
; ..............: obj.ProcData[].QuotaNonPagedPoolUsage     - The current nonpaged pool usage, in bytes.
; ..............: obj.ProcData[].PagefileUsage              - The Commit Charge value in bytes for this process. 
; ..............: obj.ProcData[].PeakPagefileUsage          - The peak value in bytes of the process Commit Charge.
; ..............: obj.ProcData[].ReadOperationCount         - The number of read operations performed.
; ..............: obj.ProcData[].WriteOperationCount        - The number of write operations performed.
; ..............: obj.ProcData[].OtherOperationCount        - The number of I/O operations performed (no read/write).
; ..............: obj.ProcData[].ReadTransferCount          - The number of bytes read.
; ..............: obj.ProcData[].WriteTransferCount         - The number of bytes written.
; ..............: obj.ProcData[].OtherTransferCount         - The number of bytes transferred (no read/write).
; ..............: obj.ProcData[].CycleTime                  - Sum of the cycle time of all threads of the process.
; ..............: obj.ProcData[].HandleCount                - Number of open handles that belong to the process.
; ..............: obj.ProcData[].GdiHandles                 - Number of GDI handles that belong to the process.
; ..............: obj.ProcData[].UserHandles                - Number of USER handles that belong to the process.
; ..............: obj.ProcData[].PriorityClass              - Priority class for the process.
; ----------------------------------------------------------------------------------------------------------------------
SysProcInfo_ToggleTimer(aParams*) {
    Static B_RUNNING, B_FIRSTRUN, N_MODE, H_WND, N_MESSAGE, N_TIME, A_PIDS, A_PROCS, OBJ_INFO, P_TIMER
    
    If ( aParams[1] == "START" ) {     ; Called by the user.
        If ( B_RUNNING )
            Return -1
        If ( aParams[2]  < 1 || aParams[2] > 3          )
        || ( aParams[2] == 1 && aParams.MaxIndex() != 5 )
        || ( aParams[2]  > 1 && aParams.MaxIndex() != 6 )
        || ( aParams[2]  > 1 && !isObject(aParams[6])   )
            Return -2
        
        ; Parameters parsing.
        N_MODE := aParams[2], H_WND := aParams[3], N_MESSAGE := aParams[4], N_TIME := aParams[5], A_PIDS := aParams[6]
        
        B_RUNNING := 1, B_FIRSTRUN := 1, A_PROCS := Object(), OBJ_INFO := Object()
        Loop % A_PIDS.MaxIndex()
            A_PROCS[A_Index] := DllCall( "OpenProcess", UInt,0x0400|0x0010, Int,0, UInt,A_PIDS[A_Index] )
        
        Return P_TIMER := DllCall( "SetTimer", Ptr,0, UInt,0, UInt,N_TIME, Ptr,RegisterCallback(A_ThisFunc) )
    }
    Else If ( aParams[1] == "STOP" ) { ; Called by the user.
        If ( !B_RUNNING )
            Return -1
        If ( aParams.MaxIndex() > 1 )
            Return -2
        
        Loop % A_PROCS.MaxIndex()
            DllCall( "CloseHandle", Ptr,A_PROCS[A_Index] )
        
        B_RUNNING := 0
        A_PIDS := "", A_PROCS := "", OBJ_INFO := "" ; Release objects.
        
        Return DllCall( "KillTimer", Ptr,0, Ptr,P_TIMER )
    }
    Else {                          ; Called by the timer.
        If aParams[1] is not xdigit ; Return an error if the first parameter is not a hwnd.
            Return -3
        
        f := A_FormatInteger
        SetFormat, Float, 6.2
        If ( N_MODE == 1 || N_MODE == 3 ) {
            OBJ_INFO.SystemData             := SysProcInfo_GetSystemMemoryStatus()
            OBJ_INFO.SystemData.SystemTimes := SysProcInfo_GetSystemTimes()
        }
        If ( N_MODE == 2 || N_MODE == 3 ) {
            (B_FIRSTRUN) ? OBJ_INFO.ProcData := Object()
            Loop % A_PROCS.MaxIndex()
            {
                If ( B_FIRSTRUN )
                    nOldKernTime := 0
                  , nOldUserTime := 0
                Else
                    nOldKernTime := OBJ_INFO.ProcData[A_Index].OldKernTime
                  , nOldUserTime := OBJ_INFO.ProcData[A_Index].OldUserTime
                
                OBJ_INFO.ProcData[A_Index]              := SysProcInfo_GetProcessMemoryInfo(A_PROCS[A_Index])
                OBJ_INFO.ProcData[A_Index].Pid          := A_PIDS[A_Index]
                OBJ_INFO.ProcData[A_Index].ProcessTimes := SysProcInfo_GetProcessTimes( A_PROCS[A_Index], nOldKernTime
                                                                                      , nOldUserTime )
                OBJ_INFO.ProcData[A_Index].OldKernTime  := nOldKernTime ; Needed because of ByRef limitations.
                OBJ_INFO.ProcData[A_Index].OldUserTime  := nOldUserTime ; Needed because of ByRef limitations.
            }
        }
        SetFormat, Integer, %f%
        
        (B_FIRSTRUN) ? B_FIRSTRUN := 0
                     : DllCall( "SendNotifyMessage", Ptr,H_WND, UInt,N_MESSAGE, Ptr,0, Ptr,Object(OBJ_INFO) )
    }
}

; ----------------------------------------------------------------------------------------------------------------------
; Function .....: SysProcInfo_GetSystemTimes
; Description ..: Returns the percentage of the total CPU Load. Call it repeateadly for consistent results.
; Thanks .......: Sean and Laszlo: http://www.autohotkey.com/community/viewtopic.php?t=18913
; ----------------------------------------------------------------------------------------------------------------------
SysProcInfo_GetSystemTimes() {
    Static nOldIdleTime, nOldKernTime, nOldUserTime, nNewIdleTime, nNewKernTime, nNewUserTime
    nOldIdleTime := nNewIdleTime, nOldKernTime := nNewKernTime, nOldUserTime := nNewUserTime
    DllCall( "GetSystemTimes", Int64P,nNewIdleTime, Int64P,nNewKernTime, Int64P,nNewUserTime )
    Return (1 - (nNewIdleTime-nOldIdleTime)/(nNewKernTime-nOldKernTime + nNewUserTime-nOldUserTime)) * 100
}

; ----------------------------------------------------------------------------------------------------------------------
; Function .....: SysProcInfo_GetSystemMemoryStatus
; Description ..: Retrieves information about the system's current usage of both physical and virtual memory.
; Return .......: An object containing system performance information, structured like the following:
; ..............: obj.MemoryLoad        - Percentage of physical memory in use.
; ..............: obj.CommitTotal       - Number of pages currently committed by the system.
; ..............: obj.CommitLimit       - Max number of pages that can be committed by the system.
; ..............: obj.CommitPeak        - Max number of pages committed since last reboot.
; ..............: obj.PhysicalTotal     - The amount of actual physical memory, in pages.
; ..............: obj.PhysicalAvailable - The amount of available physical memory, in pages.
; ..............: obj.PhysicalUsed      - The amount of used physical memory, in pages.
; ..............: obj.SystemCache       - The amount of system cache memory, in pages.
; ..............: obj.KernelTotal       - Memory in paged and nonpaged kernel pools, in pages.
; ..............: obj.KernelPaged       - Memory currently in the paged kernel pool, in pages.
; ..............: obj.KernelNonpaged    - Memory currently in the nonpaged kernel pool, in pages.
; ..............: obj.PageSize          - The size of a page, in bytes.
; ..............: obj.HandleCount       - The current number of open handles.
; ..............: obj.ProcessCount      - The current number of processes.
; ..............: obj.ThreadCount       - The current number of threads.
; ----------------------------------------------------------------------------------------------------------------------
SysProcInfo_GetSystemMemoryStatus() {
    nSz := VarSetCapacity(PERFORMANCEINFO, (A_PtrSize == 4) ? 56 : 104), NumPut(nSz, PERFORMANCEINFO, 0)
    DllCall( "psapi.dll\GetPerformanceInfo", Ptr,&PERFORMANCEINFO, UInt,nSz )
    nPhysUsed := NumGet(PERFORMANCEINFO, A_PtrSize*4, "UPtr") - NumGet(PERFORMANCEINFO, A_PtrSize*5, "UPtr")
    nMemLoad  := Ceil((nPhysUsed*100) / NumGet(PERFORMANCEINFO, A_PtrSize*4, "UPtr"))
    Return { "MemoryLoad":        nMemLoad  ; Not present in the WinAPI PERFORMANCE_INFORMATION structure.
           , "CommitTotal":       NumGet( PERFORMANCEINFO, A_PtrSize,                  "UPtr" )
           , "CommitLimit":       NumGet( PERFORMANCEINFO, A_PtrSize *  2,             "UPtr" )
           , "CommitPeak":        NumGet( PERFORMANCEINFO, A_PtrSize *  3,             "UPtr" )
           , "PhysicalTotal":     NumGet( PERFORMANCEINFO, A_PtrSize *  4,             "UPtr" )
           , "PhysicalAvailable": NumGet( PERFORMANCEINFO, A_PtrSize *  5,             "UPtr" )
           , "PhysicalUsed":      nPhysUsed ; Not present in the WinAPI PERFORMANCE_INFORMATION structure.
           , "SystemCache":       NumGet( PERFORMANCEINFO, A_PtrSize *  6,             "UPtr" )
           , "KernelTotal":       NumGet( PERFORMANCEINFO, A_PtrSize *  7,             "UPtr" )
           , "KernelPaged":       NumGet( PERFORMANCEINFO, A_PtrSize *  8,             "UPtr" )
           , "KernelNonpaged":    NumGet( PERFORMANCEINFO, A_PtrSize *  9,             "UPtr" )
           , "PageSize":          NumGet( PERFORMANCEINFO, A_PtrSize * 10,             "UPtr" )
           , "HandleCount":       NumGet( PERFORMANCEINFO, A_PtrSize * 11,             "UInt" )
           , "ProcessCount":      NumGet( PERFORMANCEINFO, (A_PtrSize == 4) ? 48 : 92, "UInt" )
           , "ThreadCount":       NumGet( PERFORMANCEINFO, (A_PtrSize == 4) ? 52 : 96, "UInt" ) }
}

; ----------------------------------------------------------------------------------------------------------------------
; Function .....: SysProcInfo_GetProcessTimes
; Description ..: Returns the CPU Load time for the specified process. Call it repeateadly for consistent results.
; Parameters ...: hProc        - Handle to the process with PROCESS_QUERY_INFORMATION and PROCESS_VM_READ access.
; ..............: nOldKernTime - Old kernel time. Seed 0 on start.
; ..............: nOldUserTime - Old user time. Seed 0 on start.
; Thanks .......: Sean and Laszlo: http://www.autohotkey.com/community/viewtopic.php?t=18913
; ----------------------------------------------------------------------------------------------------------------------
SysProcInfo_GetProcessTimes(hProc, ByRef nOldKernTime, ByRef nOldUserTime) {
    DllCall( "GetProcessTimes", Ptr,hProc, Int64P,nCreationTime, Int64P,nExitTime, Int64P,nNewKernTime
                              , Int64P,nNewUserTime )
    nProcTime    := (nNewKernTime-nOldKernTime + nNewUserTime-nOldUserTime)*1.e-5
    nOldKernTime := nNewKernTime, nOldUserTime := nNewUserTime
    Return nProcTime
}

; ----------------------------------------------------------------------------------------------------------------------
; Function .....: SysProcInfo_GetProcessMemoryInfo
; Description ..: Retrieves information about the memory usage of the specified process.
; Parameters ...: hProc - Handle to the process with PROCESS_QUERY_INFORMATION and PROCESS_VM_READ access.
; Return .......: An object containing process information, structured like the following:
; ..............: obj.Pid                        - Process identifier.
; ..............: obj.ProcessTimes               - Process CPU Load Time.
; ..............: obj.PageFaultCount             - The number of page faults.
; ..............: obj.PeakWorkingSetSize         - The peak working set size, in bytes.
; ..............: obj.WorkingSetSize             - The current working set size, in bytes.
; ..............: obj.QuotaPeakPagedPoolUsage    - The peak paged pool usage, in bytes.
; ..............: obj.QuotaPagedPoolUsage        - The current paged pool usage, in bytes.
; ..............: obj.QuotaPeakNonPagedPoolUsage - The peak nonpaged pool usage, in bytes.
; ..............: obj.QuotaNonPagedPoolUsage     - The current nonpaged pool usage, in bytes.
; ..............: obj.PagefileUsage              - The Commit Charge value in bytes for this process. 
; ..............: obj.PeakPagefileUsage          - The peak value in bytes of the process Commit Charge.
; ..............: obj.ReadOperationCount         - The number of read operations performed.
; ..............: obj.WriteOperationCount        - The number of write operations performed.
; ..............: obj.OtherOperationCount        - The number of I/O operations performed (no read/write).
; ..............: obj.ReadTransferCount          - The number of bytes read.
; ..............: obj.WriteTransferCount         - The number of bytes written.
; ..............: obj.OtherTransferCount         - The number of bytes transferred (no read/write).
; ..............: obj.CycleTime                  - Sum of the cycle time of all threads of the process.
; ..............: obj.HandleCount                - Number of open handles that belong to the process.
; ..............: obj.GdiHandles                 - Number of GDI handles that belong to the process.
; ..............: obj.UserHandles                - Number of USER handles that belong to the process.
; ..............: obj.PriorityClass              - Priority class for the process.
; ----------------------------------------------------------------------------------------------------------------------
SysProcInfo_GetProcessMemoryInfo(hProc) {
    nSz := VarSetCapacity( PROCMEMCOUNTERS, (A_PtrSize == 4) ? 40 : 72, 0 ), NumPut( nSz, PROCMEMCOUNTERS, 0 )
    VarSetCapacity(        IOCOUNTERS,      48,                         0 )
    DllCall( "psapi.dll\GetProcessMemoryInfo",  Ptr,hProc, Ptr,&PROCMEMCOUNTERS, UInt,nSz )
    DllCall( "GetProcessIoCounters",            Ptr,hProc, Ptr,&IOCOUNTERS                )
    DllCall( "QueryProcessCycleTime",           Ptr,hProc, UInt64P,nCycleTime             )
    DllCall( "GetProcessHandleCount",           Ptr,hProc, UIntP,nHandleCount             )
    nGdiHandles := DllCall( "GetGuiResources",  Ptr,hProc, UInt,0                         )
    nUsrHandles := DllCall( "GetGuiResources",  Ptr,hProc, UInt,1                         )
    nPriority   := DllCall( "GetPriorityClass", Ptr,hProc                                 )
    Return { "PageFaultCount":             NumGet( PROCMEMCOUNTERS, 4,                          "UInt"   )
           , "PeakWorkingSetSize":         NumGet( PROCMEMCOUNTERS, 8,                          "UPtr"   )
           , "WorkingSetSize":             NumGet( PROCMEMCOUNTERS, (A_PtrSize == 4) ? 12 : 16, "UPtr"   )
           , "QuotaPeakPagedPoolUsage":    NumGet( PROCMEMCOUNTERS, (A_PtrSize == 4) ? 16 : 24, "UPtr"   )
           , "QuotaPagedPoolUsage":        NumGet( PROCMEMCOUNTERS, (A_PtrSize == 4) ? 20 : 32, "UPtr"   )
           , "QuotaPeakNonPagedPoolUsage": NumGet( PROCMEMCOUNTERS, (A_PtrSize == 4) ? 24 : 40, "UPtr"   )
           , "QuotaNonPagedPoolUsage":     NumGet( PROCMEMCOUNTERS, (A_PtrSize == 4) ? 28 : 48, "UPtr"   )
           , "PagefileUsage":              NumGet( PROCMEMCOUNTERS, (A_PtrSize == 4) ? 32 : 56, "UPtr"   )
           , "PeakPagefileUsage":          NumGet( PROCMEMCOUNTERS, (A_PtrSize == 4) ? 36 : 64, "UPtr"   )
           , "ReadOperationCount":         NumGet( IOCOUNTERS,      0,                          "UInt64" )
           , "WriteOperationCount":        NumGet( IOCOUNTERS,      8,                          "UInt64" )
           , "OtherOperationCount":        NumGet( IOCOUNTERS,      16,                         "UInt64" )
           , "ReadTransferCount":          NumGet( IOCOUNTERS,      24,                         "UInt64" )
           , "WriteTransferCount":         NumGet( IOCOUNTERS,      32,                         "UInt64" )
           , "OtherTransferCount":         NumGet( IOCOUNTERS,      40,                         "UInt64" )
           , "CycleTime":                  nCycleTime
           , "HandleCount":                nHandleCount
           , "GdiHandles":                 nGdiHandles
           , "UserHandles":                nUsrHandles
           , "PriorityClass":              nPriority                                                     }
}

/* EXAMPLE CODE:
#Persistent
#SingleInstance force
Run, calc.exe,,, pid1
Run, cmd.exe,,, pid2
arrPid := [ pid1, pid2 ]
nMsg := DllCall( "RegisterWindowMessage", Str,"AUTOHOTKEY_SYSPROCINFO_LIBRARY" )
OnMessage(nMsg, "AHKNOTIFY")
OnExit, Quit
SysProcInfo_ToggleTimer("START", 3, A_ScriptHwnd, nMsg, 1000, arrPid)
Return

Quit:
SysProcInfo_ToggleTimer("STOP")
ExitApp

AHKNOTIFY(wParam, lParam) {
    obj := Object(lParam)
    FileAppend, % "`n==="
                . "`nSystem Times: "               obj.SystemData.SystemTimes
                . "`nMemoryLoad: "                 obj.SystemData.MemoryLoad
                . "`nCommitTotal: "                obj.SystemData.CommitTotal
                . "`nCommitLimit: "                obj.SystemData.CommitLimit
                . "`nCommitPeak: "                 obj.SystemData.CommitPeak
                . "`nPhysicalTotal: "              obj.SystemData.PhysicalTotal
                . "`nPhysicalAvailable: "          obj.SystemData.PhysicalAvailable
                . "`nPhysicalUsed: "               obj.SystemData.PhysicalUsed
                . "`nSystemCache: "                obj.SystemData.SystemCache
                . "`nKernelTotal: "                obj.SystemData.KernelTotal
                . "`nKernelPaged: "                obj.SystemData.KernelPaged
                . "`nKernelNonpaged: "             obj.SystemData.KernelNonpaged
                . "`nPageSize: "                   obj.SystemData.PageSize
                . "`nHandleCount: "                obj.SystemData.HandleCount
                . "`nProcessCount: "               obj.SystemData.ProcessCount
                . "`nThreadCount: "                obj.SystemData.ThreadCount
                , test.txt
    FileAppend, % "`n---"
                . "`nPid: "                        obj.ProcData[1].Pid
                . "`nProcessTimes: "               obj.ProcData[1].ProcessTimes
                . "`nPageFaultCount: "             obj.ProcData[1].PageFaultCount
                . "`nPeakWorkingSetSize: "         obj.ProcData[1].PeakWorkingSetSize
                . "`nWorkingSetSize: "             obj.ProcData[1].WorkingSetSize
                . "`nQuotaPeakPagedPoolUsage: "    obj.ProcData[1].QuotaPeakPagedPoolUsage
                . "`nQuotaPagedPoolUsage: "        obj.ProcData[1].QuotaPagedPoolUsage
                . "`nQuotaPeakNonPagedPoolUsage: " obj.ProcData[1].QuotaPeakNonPagedPoolUsage
                . "`nQuotaNonPagedPoolUsage: "     obj.ProcData[1].QuotaNonPagedPoolUsage
                . "`nPagefileUsage: "              obj.ProcData[1].PagefileUsage 
                . "`nPeakPagefileUsage: "          obj.ProcData[1].PeakPagefileUsage
                . "`nReadOperationCount: "         obj.ProcData[1].ReadOperationCount
                . "`nWriteOperationCount: "        obj.ProcData[1].WriteOperationCount
                . "`nOtherOperationCount: "        obj.ProcData[1].OtherOperationCount
                . "`nReadTransferCount: "          obj.ProcData[1].ReadTransferCount
                . "`nWriteTransferCount: "         obj.ProcData[1].WriteTransferCount
                . "`nOtherTransferCount: "         obj.ProcData[1].OtherTransferCount
                . "`nCycleTime: "                  obj.ProcData[1].CycleTime
                . "`nHandleCount: "                obj.ProcData[1].HandleCount
                . "`nGdiHandles: "                 obj.ProcData[1].GdiHandles
                . "`nUserHandles: "                obj.ProcData[1].UserHandles
                . "`nPriorityClass: "              obj.ProcData[1].PriorityClass
                . "`n---"
                . "`nPid: "                        obj.ProcData[2].Pid
                . "`nProcessTimes: "               obj.ProcData[2].ProcessTimes
                . "`nPageFaultCount: "             obj.ProcData[2].PageFaultCount
                . "`nPeakWorkingSetSize: "         obj.ProcData[2].PeakWorkingSetSize
                . "`nWorkingSetSize: "             obj.ProcData[2].WorkingSetSize
                . "`nQuotaPeakPagedPoolUsage: "    obj.ProcData[2].QuotaPeakPagedPoolUsage
                . "`nQuotaPagedPoolUsage: "        obj.ProcData[2].QuotaPagedPoolUsage
                . "`nQuotaPeakNonPagedPoolUsage: " obj.ProcData[2].QuotaPeakNonPagedPoolUsage
                . "`nQuotaNonPagedPoolUsage: "     obj.ProcData[2].QuotaNonPagedPoolUsage
                . "`nPagefileUsage: "              obj.ProcData[2].PagefileUsage
                . "`nPeakPagefileUsage: "          obj.ProcData[2].PeakPagefileUsage
                . "`nReadOperationCount: "         obj.ProcData[2].ReadOperationCount
                . "`nWriteOperationCount: "        obj.ProcData[2].WriteOperationCount
                . "`nOtherOperationCount: "        obj.ProcData[2].OtherOperationCount
                . "`nReadTransferCount: "          obj.ProcData[2].ReadTransferCount
                . "`nWriteTransferCount: "         obj.ProcData[2].WriteTransferCount
                . "`nOtherTransferCount: "         obj.ProcData[2].OtherTransferCount
                . "`nCycleTime: "                  obj.ProcData[2].CycleTime
                . "`nHandleCount: "                obj.ProcData[2].HandleCount
                . "`nGdiHandles: "                 obj.ProcData[2].GdiHandles
                . "`nUserHandles: "                obj.ProcData[2].UserHandles
                . "`nPriorityClass: "              obj.ProcData[2].PriorityClass
                . "`n===`n"
                , test.txt
}
*/

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。