zoukankan      html  css  js  c++  java
  • Visual C#设计多功能关机程序(2)

    二. 设计获取系统信息的Windows窗体

      1. 界面的设计

      向工程中增加一个Windows窗体并向窗体中添加如下控件:



      2. 在窗体类中引用API函数

    using System.Runtime.InteropServices ;
    using System.Text ;
    [ DllImport("kernel32") ]
    public static extern void GetWindowsDirectory(StringBuilder WinDir,int count) ;
    [ DllImport("kernel32") ]
    public static extern void GetSystemDirectory(StringBuilder SysDir,int count) ;
    [ DllImport("kernel32") ]
    public static extern void GetSystemInfo(ref CPU_INFO cpuinfo) ;
    [ DllImport("kernel32") ]
    public static extern void GlobalMemoryStatus(ref MEMORY_INFO meminfo) ;
    [ DllImport("kernel32") ]
    public static extern void GetSystemTime(ref SYSTEMTIME_INFO stinfo) ;

      以上几个API的作用分别是获取系统路径,获得CPU相关信息,获得内存的相关信息,获得系统时间等。

      3. 定义以下各结构

      在声明完所有的API函数后,我们发现后三个函数分别用到了CPU_INFO、MEMORY_INFO、SYSTEMTIME_INFO等结构,这些结构并非是.Net内部的,它们从何而来?其实,我们在用到以上API调用时均需用到以上结构,我们将函数调用获得的信息存放在以上的结构体中,最后返回给程序输出。这些结构体比较复杂,但是如果开发者能够熟练运用,那么整个API世界将尽在开发者的掌握之中。以下就是上述结构体的声明:

    //定义CPU的信息结构
    [StructLayout(LayoutKind.Sequential) ]
    public struct CPU_INFO
    {
    public uint dwOemId ;
    public uint dwPageSize ;
    public uint lpMinimumApplicationAddress ;
    public uint lpMaximumApplicationAddress ;
    public uint dwActiveProcessorMask ;
    public uint dwNumberOfProcessors ;
    public uint dwProcessorType ;
    public uint dwAllocationGranularity ;
    public uint dwProcessorLevel ;
    public uint dwProcessorRevision ;
    }

    file://定义内存的信息结构
    [StructLayout(LayoutKind.Sequential) ]
    public struct MEMORY_INFO
    {
    public uint dwLength ;
    public uint dwMemoryLoad ;
    public uint dwTotalPhys ;
    public uint dwAvailPhys ;
    public uint dwTotalPageFile ;
    public uint dwAvailPageFile ;
    public uint dwTotalVirtual ;
    public uint dwAvailVirtual ;
    }

    file://定义系统时间的信息结构
    [StructLayout(LayoutKind.Sequential) ]
    public struct SYSTEMTIME_INFO
    {
    public ushort wYear ;
    public ushort wMonth ;
    public ushort wDayOfWeek ;
    public ushort wDay ;
    public ushort wHour ;
    public ushort wMinute ;
    public ushort wSecond ;
    public ushort wMilliseconds ;
    }

      5. 编写窗体类的方法

    private void button1_Click(object sender, System.EventArgs e )
    {
    file://调用GetWindowsDirectory和GetSystemDirectory函数分别取得Windows路径和系统路径
    const int nChars = 128 ;
    StringBuilder Buff = new StringBuilder(nChars) ;
    GetWindowsDirectory(Buff,nChars) ;
    WindowsDirectory.Text = "Windows路径:"+Buff.ToString( ) ;
    GetSystemDirectory(Buff,nChars) ;
    SystemDirectory.Text = " 系统路径:"+Buff.ToString( ) ;

    file://调用GetSystemInfo函数获取CPU的相关信息
    CPU_INFO CpuInfo ;
    CpuInfo = new CPU_INFO( ) ;
    GetSystemInfo(ref CpuInfo) ;
    NumberOfProcessors.Text = "本计算机中有"+CpuInfo.dwNumberOfProcessors.ToString( ) +"个CPU";
    ProcessorType.Text = "CPU的类型为"+CpuInfo.dwProcessorType.ToString( ) ;
    ProcessorLevel.Text = "CPU等级为"+CpuInfo.dwProcessorLevel.ToString( ) ;
    OemId.Text = "CPU的OEM ID为"+CpuInfo.dwOemId.ToString( ) ;
    PageSize.Text = "CPU中的页面大小为"+CpuInfo.dwPageSize.ToString( ) ;

    file://调用GlobalMemoryStatus函数获取内存的相关信息
    MEMORY_INFO MemInfo ;
    MemInfo = new MEMORY_INFO( ) ;
    GlobalMemoryStatus(ref MemInfo) ;
    MemoryLoad.Text = MemInfo.dwMemoryLoad.ToString( ) +"%的内存正在使用" ;
    TotalPhys.Text = "物理内存共有"+MemInfo.dwTotalPhys.ToString( ) +"字节" ;
    AvailPhys.Text = "可使用的物理内存有"+MemInfo.dwAvailPhys.ToString( ) +"字节" ;
    TotalPageFile.Text = "交换文件总大小为"+MemInfo.dwTotalPageFile.ToString( ) +"字节" ;
    AvailPageFile.Text = "尚可交换文件大小为"+MemInfo.dwAvailPageFile.ToString( ) +"字节" ;
    TotalVirtual.Text = "总虚拟内存有"+MemInfo.dwTotalVirtual.ToString( ) +"字节" ;
    AvailVirtual.Text = "未用虚拟内存有"+MemInfo.dwAvailVirtual.ToString( ) +"字节" ;

    file://调用GetSystemTime函数获取系统时间信息
    SYSTEMTIME_INFO StInfo ;
    StInfo = new SYSTEMTIME_INFO( ) ;
    GetSystemTime(ref StInfo) ;
    Date.Text = StInfo.wYear.ToString( ) +"年"+StInfo.wMonth.ToString( ) +"月"+StInfo.wDay.ToString( ) +"日" ;
    Time.Text = (StInfo.wHour+8).ToString( ) +"点"+StInfo.wMinute.ToString( ) +"分"+StInfo.wSecond.ToString( ) +"秒" ;
    }

      三. 结束语。

      上面介绍了Visual C#开发多功能关机程序的整个过程,该程序有一定的实用价值。通过本文的学习,我相信稍有API使用基础的开发者可以马上触类旁通,很快掌握Visual C#中对API的操作。上面给出的实例仅仅是一个简单的程序,不过有兴趣的读者可以进一步完善其功能,做出更完美的系统应用程序。
  • 相关阅读:
    Buffer lock
    union all合并记录
    欢迎您在新浪博客安家
    热点块引发的cache buffers cahins latch
    linux下能ping ip不能ping域名详解
    简易计算器页面
    学生管理系统报错(一)
    低效的SQL引发的cache buffers chains latch
    常用监控SQL
    C/C++ XMPP/Jabber 客户端类库对比/点评
  • 原文地址:https://www.cnblogs.com/YrRoom/p/297987.html
Copyright © 2011-2022 走看看