Remote API(RAPI)之 系统信息

RAPI提供了一些取系统信息的函数

CeGetSystemInfo:返回当前系统信息

CeGetSystemMetrics:获取Windows元素的尺寸和系统设置

CeGetVersionEx:获取当前运行的操作系统版本的扩展信息

CeGetSystemPowerStatusEx:获取电池状态

CeGlobalMemoryStatus:获取系统物理内存和虚拟内存信息

CeGetStoreInfomation:获取存储器信息并填入STORE_INFORMATION结构

 

        SYSTEM_INFO si; //系统信息
        OSVERSIONINFO versionInfo; //版本信息
        SYSTEM_POWER_STATUS_EX PowerStatus; //电源信息
        MEMORYSYATUS ms; //内存信息
        String info;

        private const int TimeOut = 2000;//异步连接设备超时时间2秒 
        private void btnGetSystemInfo_Click(object sender, EventArgs e)
        {
            Rapiinit ri = new Rapiinit();
            ri.cbsize = Marshal.SizeOf(ri);
            uint hRes = CeRapiInitEx(ref ri);
            ManualResetEvent me = new ManualResetEvent(false);
            me.SafeWaitHandle = new Microsoft.Win32.SafeHandles.SafeWaitHandle(ri.heRapiInit, false);
            if (!me.WaitOne(TimeOut, true))
            {
                CeRapiUninit();
            }


            //1、检索系统信息
            try
            {
                CeGetSystemInfo(out si);
            }
            catch (Exception)
            {
                throw new Exception("Error retrieving system info.");
            }

            //2、检索设备操作系统版本号
            bool b;
            versionInfo.dwOSVersionInfoSize = Marshal.SizeOf(typeof(OSVERSIONINFO));//设置为结构大小
            b = CeGetVersionEx(out versionInfo);
            if (!b)
            {
                throw new Exception("Error retrieving version information.");
            }

            //3、检索设备电源状态
            try
            {
                CeGetSystemPowerStatusEx(out PowerStatus, true);// true 表示读取最新的电源信息,否则将从缓存中获得
            }
            catch (Exception)
            {
                throw new Exception("Error retriving System power status.");
            }

            // 4、检索设备内存状态 
            CeGlobalMemoryStatus(out ms);

            //设置检索信息的格式
            info = "The connected device has an";
            switch (si.wProcessorArchitecture)
            {
                case ProcessorArchitecture.Intel:
                    info += "Intel processor.\n";
                    break;
                case ProcessorArchitecture.ARM:
                    info += "ARM processor.\n";
                    break;
                default:
                    info += "unknown processor type.\n";
                    break;
            }

            info += "OS vesion:" + versionInfo.dwMajorVersion + "." + versionInfo.dwMinorVersion + "." + versionInfo.dwBuildNumber + "\n";
            if (PowerStatus.ACLineStatus == 1)
            {
                info += "On AC power:Yes\n";
            }
            else
            {
                info += "On AC power:NO\n";
            }
            info += "Battery level:"+PowerStatus.BackupBatteryLifePercent+"%\n";
            info += "Total memory:" + string.Format("{0:###,###,###}", ms.dwTotalPhys + "\n");

            richTextBox1.AppendText(info);

            CeRapiUninit();
        }

        #region 声明API

        [DllImport("rapi.dll")]
        private static extern uint CeRapiInitEx(ref Rapiinit pRapiInt);

        [DllImport("rapi.dll", CharSet = CharSet.Unicode)]
        internal static extern int CeRapiUninit();

        [DllImport("rapi.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        internal static extern int CeGetSystemInfo(out SYSTEM_INFO pSI);

        [DllImport("rapi.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        internal static extern bool CeGetVersionEx(out OSVERSIONINFO lpVersionInformation);

        [DllImport("rapi.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        internal static extern bool CeGetSystemPowerStatusEx(out SYSTEM_POWER_STATUS_EX pStauts, bool fUpdate);

        [DllImport("rapi.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        internal static extern void CeGlobalMemoryStatus(out MEMORYSYATUS msce);

        #endregion



        #region 声明结构

        [StructLayout(LayoutKind.Explicit)]
        private struct Rapiinit
        {
            [FieldOffset(0)]
            public int cbsize;
            [FieldOffset(4)]
            public readonly IntPtr heRapiInit;
            [FieldOffset(8)]
            private readonly IntPtr hrRapiInit;
        }

        //处理器架构CeGetSystemInfo
        public enum ProcessorArchitecture : short
        {
            Intel=0,
            MIPS=1,
            Alpha=2,
            PPC=3,
            SHX=4,
            ARM=5,
            IA64=6,
            Alpha64=7,
            Unknown=-1
        }

        //移动设备内存信息
        [StructLayout(LayoutKind.Sequential)]
        public struct MEMORYSYATUS
        {
            internal uint dwLength;
            public int dwMemoryLoad;//当前内存占用(%)
            public int dwTotalPhys;//物理内存总量
            public int dwAvailPhys;//可用物理内存
            public int dwTotalPageFile;//分页数
            public int dwAvailPageFile;//未分页
            public int dwTotalVirtual;//虚拟内存总量
            public int dwAvailVirtual;//可用虚拟内存
        }

        //移动设备电源信息
        public struct SYSTEM_POWER_STATUS_EX
        {
            public byte ACLineStatus;//交流电状态
            public byte BatteryFlag;//电池充电状态 1 High,2 Low,4 Critical,8 Charging,128 No system battery,255 Unknown status
            public byte BatteryLifePercent;//电池电量剩余百分比
            internal byte Reserved1;//保留字段,设置为0
            public int BatteryLifeTime;//电池电量剩余时间(秒)
            public int BatteryFullLifeTime;//电池充满电的总可用时间(秒)
            internal byte Reserved2;//保留字段,设置为0
            public byte BackupBatteryFlag;//后备电池状态
            public byte BackupBatteryLifePercent;//后备电池剩余电量百分比
            internal byte Reserved3;//保留字段,设置为0
            public int BackupBatteryLifeTime;//后备电池电量剩余时间(秒)
            public int BackupBatteryFullLifeTime;//后备电池充满电的总可用时间(秒)
        }

        //OSVERSIONINFO platform type
        public enum PlatformType : int
        {
            //win32 on windows ce
            VER_PLATFORM_WIN32_CE=3
        }

        public struct OSVERSIONINFO
        {
            internal int dwOSVersionInfoSize;
            public int dwMajorVersion;//主板本信息
            public int dwMinorVersion;//副版本信息
            public int dwBuildNumber;//编译信息
            public PlatformType dwPlatfromId;//操作系统类型
        }


        //处理器类型CeGetSystemInfo
        public enum ProcessorType : int
        {
            PROCESSOR_INTEL_386 = 386,  //386
            PROCESSOR_INTEL_486 = 486,  //486
            PROCESSOR_INTEL_PENTIUM = 586,   //Pentium
            PROCESSOR_INTEL_PENTIUMII = 686,  //P2
            PROCESSOR_INTEL_IA64 = 2200,  //IA 64
            PROCESSOR_MIPS_R4000 = 4000,  //MIS 4000 series
            PROCESSOR_ALPHA_21064 = 21064,  //Alpha 21064
            PROCESSOR_PPC_403 = 403,  //PowerPC 403
            PROCESSOR_PPC_601 = 601,  //PowerPC 601
            PROCESSOR_PPC_603 = 603,  //PowerPC 603
            PROCESSOR_PPC_604 = 604,  //PowerPC 604
            PROCESSOR_PPC_620 = 620,  //PowerPC 620
            PROCESSOR_HITACHI_SH3 = 10003,  // Hitachi SH3
            PROCESSOR_HITACHI_SH3E = 10004,  // Hitachi SH3E
            PROCESSOR_HITACHI_SH4 = 10005,  //Hitachi SH4
            PROCESSOR_MOTOROLA_821 = 821,  //Motorola 821
            PROCESSOR_SHx_SH3 = 103,  //Hitachi SH3
            PROCESSOR_SHx_SH4 = 104,  //Hitachi SH4
            PROCESSOR_STRONGARM = 2577,  //Intel StrongARM
            PROCESSOR_ARM720 = 1824,  //ARM720
            PROCESSOR_ARM820 = 2080,  //ARM820
            PROCESSOR_ARM920 = 2336,  //ARM920
            PROCESSOR_ARM_7TDMI = 70001  //ARM7
        }

        //CeGetSystemInfo的数据结构
        public struct SYSTEM_INFO
        {
            //处理器架构
            public ProcessorArchitecture wProcessorArchitecture;
            //保留
            internal ushort wReserved;
            //Specifies the page size and the granularity of page protection and commitment. 
            public int dwPageSize;
            //应用程序可访问内存地址的最小值    
            //(Pointer to the lowest memory address accessible to applications and dynamic-link libraries (DLLs). )
            public int lpMinimumApplicationAddress;
            //应用程序可访问内存地址的最大值
            public int lpMaximumApplicationAddress;
            //Specifies a mask representing the set of processors configured into the system. Bit 0 is processor 0; bit 31 is processor 31. 
            public int dwActiveProcessorMask;
            //处理器数量(Specifies the number of processors in the system.)
            public int dwNumberOfProcessors;
            //处理器类型(Specifies the type of processor in the system.)
            public ProcessorType dwProcessorType;
            //Specifies the granularity with which virtual memory is allocated.
            public int dwAllocationGranularity;
            //Specifies the system architecture-dependent processor level. 
            public short wProcessorLevel;
            //Specifies an architecture-dependent processor revision.
            public short wProcessorRevision;
        }


        #endregion

 

posted @ 2016-08-17 18:39  发明创造小能手  阅读(536)  评论(0编辑  收藏  举报
levels of contents