# C# windows api 获取CPU使用率

代码

C#
public static class CPUHelper
{
    public static CPUTime GetCPUTime()
    {
        if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
            return WindowsCPU.GetCPUTime();
        return new CPUTime();
    }

    public static double CalculateCPULoad(CPUTime oldTime, CPUTime newTime)
    {
        ulong totalTicksSinceLastTime = newTime.SystemTime - oldTime.SystemTime;
        ulong idleTicksSinceLastTime = newTime.IdleTime - oldTime.IdleTime;

        double ret = 1.0f - ((totalTicksSinceLastTime > 0) ? ((double)idleTicksSinceLastTime) / totalTicksSinceLastTime : 0);

        return Math.Round(ret * 100, 2);
    }
}


public partial class WindowsCPU
{
#if NET7_0_OR_GREATER
    [LibraryImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static partial bool GetSystemTimes(out FILETIME lpIdleTime, out FILETIME lpKernelTime, out FILETIME lpUserTime);
#else
    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetSystemTimes(out FILETIME lpIdleTime, out FILETIME lpKernelTime, out FILETIME lpUserTime);
#endif
    public static CPUTime GetCPUTime(FILETIME lpIdleTime, FILETIME lpKernelTime, FILETIME lpUserTime)
    {
        var IdleTime = ((ulong)lpIdleTime.DateTimeHigh << 32) | lpIdleTime.DateTimeLow;
        var KernelTime = ((ulong)lpKernelTime.DateTimeHigh << 32) | lpKernelTime.DateTimeLow;
        var UserTime = ((ulong)lpUserTime.DateTimeHigh << 32) | lpUserTime.DateTimeLow;
    
        var SystemTime = KernelTime + UserTime;
    
        return new CPUTime(IdleTime, SystemTime);
    }
    
    public static CPUTime GetCPUTime()
    {
        if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
        {
            if (GetSystemTimes(out FILETIME lpIdleTime, out FILETIME lpKernelTime, out FILETIME lpUserTime) == false)
            {
                return default;
            }
            return GetCPUTime(lpIdleTime, lpKernelTime, lpUserTime);
        }
        return new CPUTime();
    }
}

public struct CPUTime
{
    public CPUTime(ulong idleTime, ulong systemTime)
    {
        IdleTime = idleTime;
        SystemTime = systemTime;
    }

    public ulong IdleTime { get; private set; }
    public ulong SystemTime { get; private set; }
}

[StructLayout(LayoutKind.Sequential)]
public struct FILETIME
{
    public uint DateTimeLow;
    public uint DateTimeHigh;
}