通用类 GetCPU 返回系统CPU占用百分比

/// <summary>
    /// 返回系统CPU占用百分比
    /// </summary>
    public class GetCPU
    {
        public static int GetCpuUsage()
        {
            return CpuUsage.Create().Query();
        }

        public abstract class CpuUsage
        {
            private static GetCPU.CpuUsage m_CpuUsage;

            protected CpuUsage()
            {
            }


            public static GetCPU.CpuUsage Create()
            {
                if (m_CpuUsage == null)
                {
                    if (Environment.OSVersion.Platform != PlatformID.Win32NT)
                    {
                        if (Environment.OSVersion.Platform != PlatformID.Win32Windows)
                        {
                            throw new NotSupportedException();
                        }
                        m_CpuUsage = new GetCPU.CpuUsage9x();
                    }
                    else
                    {
                        m_CpuUsage = new GetCPU.CpuUsageNt();
                    }
                }
                return m_CpuUsage;
            }

            public abstract int Query();
        }

        internal sealed class CpuUsage9x : GetCPU.CpuUsage
        {
            private RegistryKey m_StatData;

            public CpuUsage9x()
            {
                try
                {
                    RegistryKey key = Registry.DynData.OpenSubKey(@"PerfStats\StartStat", false);
                    if (key == null)
                    {
                        throw new NotSupportedException();
                    }
                    key.GetValue(@"KERNEL\CPUUsage");
                    key.Close();
                    this.m_StatData = Registry.DynData.OpenSubKey(@"PerfStats\StatData", false);
                    if (this.m_StatData == null)
                    {
                        throw new NotSupportedException();
                    }
                }
                catch (NotSupportedException exception)
                {
                    throw exception;
                }
                catch (Exception exception2)
                {
                    throw new NotSupportedException("Error while querying the system information.", exception2);
                }
            }

            ~CpuUsage9x()
            {
                try
                {
                    this.m_StatData.Close();
                }
                catch
                {
                }
                try
                {
                    RegistryKey key = Registry.DynData.OpenSubKey(@"PerfStats\StopStat", false);
                    key.GetValue(@"KERNEL\CPUUsage", false);
                    key.Close();
                }
                catch
                {
                }
            }

            public override int Query()
            {
                int num;
                try
                {
                    num = (int)this.m_StatData.GetValue(@"KERNEL\CPUUsage");
                }
                catch (Exception exception)
                {
                    throw new NotSupportedException("Error while querying the system information.", exception);
                }
                return num;
            }
        }

        internal sealed class CpuUsageNt : GetCPU.CpuUsage
        {
            private const int NO_ERROR = 0;
            private long oldIdleTime;
            private long oldSystemTime;
            private double processorCount;
            private const int SYSTEM_BASICINFORMATION = 0;
            private const int SYSTEM_PERFORMANCEINFORMATION = 2;
            private const int SYSTEM_TIMEINFORMATION = 3;

            public CpuUsageNt()
            {
                byte[] lpStructure = new byte[0x20];
                byte[] buffer2 = new byte[0x138];
                byte[] buffer3 = new byte[0x2c];
                if (NtQuerySystemInformation(3, lpStructure, lpStructure.Length, IntPtr.Zero) != 0)
                {
                    throw new NotSupportedException();
                }
                if (NtQuerySystemInformation(2, buffer2, buffer2.Length, IntPtr.Zero) != 0)
                {
                    throw new NotSupportedException();
                }
                if (NtQuerySystemInformation(0, buffer3, buffer3.Length, IntPtr.Zero) != 0)
                {
                    throw new NotSupportedException();
                }
                this.oldIdleTime = BitConverter.ToInt64(buffer2, 0);
                this.oldSystemTime = BitConverter.ToInt64(lpStructure, 8);
                this.processorCount = buffer3[40];
            }

            [DllImport("ntdll")]
            private static extern int NtQuerySystemInformation(int dwInfoType, byte[] lpStructure, int dwSize, IntPtr returnLength);
            public override int Query()
            {
                byte[] lpStructure = new byte[0x20];
                byte[] buffer2 = new byte[0x138];
                if (NtQuerySystemInformation(3, lpStructure, lpStructure.Length, IntPtr.Zero) != 0)
                {
                    throw new NotSupportedException();
                }
                if (NtQuerySystemInformation(2, buffer2, buffer2.Length, IntPtr.Zero) != 0)
                {
                    throw new NotSupportedException();
                }
                double num = BitConverter.ToInt64(buffer2, 0) - this.oldIdleTime;
                double num2 = BitConverter.ToInt64(lpStructure, 8) - this.oldSystemTime;
                if (num2 != 0.0)
                {
                    num /= num2;
                }
                num = (100.0 - ((num * 100.0) / this.processorCount)) + 0.5;
                this.oldIdleTime = BitConverter.ToInt64(buffer2, 0);
                this.oldSystemTime = BitConverter.ToInt64(lpStructure, 8);
                return (int)num;
            }
        }
    }

 

posted @ 2012-08-29 15:57  暗尘掩月  阅读(221)  评论(0编辑  收藏  举报