用Visual C#获取系统信息四法

所谓系统信息,就是计算机的软件硬件信息,硬件如CPU主频、网卡名称等,软件信息就如操作系统目录,用户目录等。在平常的编程中,我们往往要用到这些系统信息,比如字体查看器,如果要写个C#版,则首先要获得系统字体的安装目录。总之,读取系统信息对于编程还是很重要的,.NET也不负所望,提供了很便利的方法,本文提供了四种方法来从各个方面对系统信息进行读取。

 


第一种方法:SystemInformation 

SystemInformation 提供静态方法和属性,它们可用于获取诸如 Windows 显示元素大小、操作系统设置、网络可用性和系统中所安装硬件的性能等信息,这种方法侧重于操作系统(这里特指Windows)的一些设置和状态

    第二种方法 :Environment 

通过这种方法可检索的系统信息包括命令行参数、环境变量设置、调用堆栈的内容、上次系统引导以来的时间,以及公共语言运行库的版本等等,测重于使用这个类的应用程序所处的环境和状态,也有比较多的动态信息,比如开机启动后的毫秒数等等。

第三种方法 RegistryKey 

这种方法方法读取的也只能是静态的设置,不过比上面两种方法更加接近操作系统,因为值是直接从注册表中读取出来的,有好处也有不好的地方,好处就是基本上可以获得任何设置。不好的地方是不够便利,毕竟,检索注册表的键值不如直接调用方法来得方便。

   第四种方法 API函数

  这种方法严格说来不是用C#来实现对系统信息的读取,因为它实际调用的是系统API。这种方法有更加有意义的地方,就在其对API功能的调用,因而我们可以做出更多的事情。这种方法也可以在Java中依样画胡芦地用到。

 

下面讲一下程序结构:

 

  1 //RegistryKey 类所需要的命名空间: 
3 using Microsoft.Win32;
4 //DllImport方法所需要的命名空间:
5 using System.Runtime.InteropServices;
6 //StringBuilder所需要的命名空间:
7 using System.Text;
8 //声明API函数
9 [DllImport("kernel32")]
10 public static extern void GetWindowsDirectory(StringBuilder WinDir,int count);
11 [DllImport("kernel32")]
12 public static extern void GetSystemDirectory(StringBuilder SysDir,int count);
13 [DllImport("kernel32")]
14 public static extern void GetSystemInfo(ref CPU_INFO cpuinfo);
15 [DllImport("kernel32")]
16 public static extern void GlobalMemoryStatus(ref MEMORY_INFO meminfo);
17 [DllImport("kernel32")]
18 public static extern void GetSystemTime(ref SYSTEMTIME_INFO stinfo);
19 //定义以下各结构
20 //定义CPU的信息结构
21 [StructLayout(LayoutKind.Sequential)]
22 public struct CPU_INFO
23 {
24 public uint dwOemId;
25 public uint dwPageSize;
26 public uint lpMinimumApplicationAddress;
27 public uint lpMaximumApplicationAddress;
28 public uint dwActiveProcessorMask;
29 public uint dwNumberOfProcessors;
30 public uint dwProcessorType;
31 public uint dwAllocationGranularity;
32 public uint dwProcessorLevel;
33 public uint dwProcessorRevision;
34 }
35 //定义内存的信息结构
36 [StructLayout(LayoutKind.Sequential)]
37 public struct MEMORY_INFO
38 {
39 public uint dwLength;
40 public uint dwMemoryLoad;
41 public uint dwTotalPhys;
42 public uint dwAvailPhys;
43 public uint dwTotalPageFile;
44 public uint dwAvailPageFile;
45 public uint dwTotalVirtual;
46 public uint dwAvailVirtual;
47 }
48 //定义系统时间的信息结构
49 [StructLayout(LayoutKind.Sequential)]
50 public struct SYSTEMTIME_INFO
51 {
52 public ushort wYear;
53 public ushort wMonth;
54 public ushort wDayOfWeek;
55 public ushort wDay;
56 public ushort wHour;
57 public ushort wMinute;
58 public ushort wSecond;
59 public ushort wMilliseconds;
60 }
61 private void initSysInfoData()
62 {
63 //获取操作系统设置
64 lstSysInfo.Items.Add("计算机名 : " + SystemInformation.ComputerName );
65 lstSysInfo.Items.Add("是否已连接网络 : " + SystemInformation.Network );
66 lstSysInfo.Items.Add("用户域 : " + SystemInformation.UserDomainName );
67 lstSysInfo.Items.Add("当前线程用户名 : " + SystemInformation.UserName );
68 lstSysInfo.Items.Add("启动方式 : " + SystemInformation.BootMode );
69 lstSysInfo.Items.Add("菜单的字体 : " + SystemInformation.MenuFont );
70 lstSysInfo.Items.Add("显示器的数目 : " + SystemInformation.MonitorCount );
71 lstSysInfo.Items.Add("鼠标已安装 : " + SystemInformation.MousePresent );
72 lstSysInfo.Items.Add("鼠标按钮数 : " + SystemInformation.MouseButtons);
73 lstSysInfo.Items.Add("是否交互模式 : " + SystemInformation.UserInteractive );
74 lstSysInfo.Items.Add("屏幕界限: " + SystemInformation.VirtualScreen );
75 }
76 public void initEnvData()
77 {
78
79 //获取程序运行的相关信息.
80 lstEnv.Items.Add("命令行:"+ Environment.CommandLine);
81 lstEnv.Items.Add("命令行参数:"+ String.Join(", ",Environment.GetCommandLineArgs()));
82 lstEnv.Items.Add("当前目录:"+ Environment.CurrentDirectory);
83 lstEnv.Items.Add("操作系统版本:"+ Environment.OSVersion);
84 lstEnv.Items.Add("系统目录:"+ Environment.SystemDirectory);
85 lstEnv.Items.Add("堆栈信息:"+ Environment.StackTrace);
86 lstEnv.Items.Add("用户域:"+ Environment.UserDomainName);
87 lstEnv.Items.Add("CLR版本:"+ Environment.Version);
88 lstEnv.Items.Add("系统启动后经过的毫秒:"+ Environment.TickCount);
89 lstEnv.Items.Add("进程上下文的物理内存量:"+ Environment.WorkingSet);
90 String[] drives = Environment.GetLogicalDrives();
91 lstEnv.Items.Add("本机磁盘驱动器: "+ String.Join(", ", drives));
92
93 // 获取本机所有环境变量
94 IDictionary environmentVariables = Environment.GetEnvironmentVariables();
95 foreach (DictionaryEntry de in environmentVariables)
96 {
97 lstEnv.Items.Add(de.Key+"="+de.Value);
98 }
99
100 }
101 public void initRegKeyData()
102 {
103 //通过注册表获取信息
104 RegistryKey Rkey = Registry.LocalMachine;
105 Rkey = Rkey.OpenSubKey("HARDWARE//DESCRIPTION//System//CentralProcessor//0");
106 lstRegkey.Items.Add("处理器信息:"+Rkey.GetValue("ProcessorNameString").ToString().Trim());
107
108 Rkey=Registry.LocalMachine;
109 Rkey = Rkey.OpenSubKey("SOFTWARE//Microsoft//Windows NT//CurrentVersion//NetworkCards//1");
110 lstRegkey.Items.Add("网卡信息:"+(String)Rkey.GetValue("Description"));
111 }
112 public void initAPIData()
113 {
114 //调用GetWindowsDirectory和GetSystemDirectory函数分别取得Windows路径和系统路径
115 const int nChars = 128;
116 StringBuilder Buff = new StringBuilder(nChars);
117 GetWindowsDirectory(Buff,nChars);
118 lstAPI.Items.Add("Windows路径:"+Buff.ToString());
119 GetSystemDirectory(Buff,nChars);
120 lstAPI.Items.Add("系统路径:"+Buff.ToString());
121 //调用GetSystemInfo函数获取CPU的相关信息
122 CPU_INFO CpuInfo;
123 CpuInfo = new CPU_INFO();
124 GetSystemInfo(ref CpuInfo);
125 //CPU信息的读取是错误的,我本只有一个CPU,读成了两个
126 lstAPI.Items.Add("本计算机中有"+CpuInfo.dwNumberOfProcessors.ToString()+"个CPU");
127 lstAPI.Items.Add("CPU的类型为"+CpuInfo.dwProcessorType.ToString());
128 lstAPI.Items.Add("CPU等级为"+CpuInfo.dwProcessorLevel.ToString());
129 lstAPI.Items.Add("CPU的OEM ID为"+CpuInfo.dwOemId.ToString());
130 lstAPI.Items.Add("CPU中的页面大小为"+CpuInfo.dwPageSize.ToString());
131 //调用GlobalMemoryStatus函数获取内存的相关信息
132 MEMORY_INFO MemInfo;
133 MemInfo = new MEMORY_INFO();
134 GlobalMemoryStatus(ref MemInfo);
135 lstAPI.Items.Add( MemInfo.dwMemoryLoad.ToString()+"%的内存正在使用");
136 lstAPI.Items.Add("物理内存共有"+MemInfo.dwTotalPhys.ToString()+"字节");
137 lstAPI.Items.Add("可使用的物理内存有"+MemInfo.dwAvailPhys.ToString()+"字节");
138 lstAPI.Items.Add( "交换文件总大小为"+MemInfo.dwTotalPageFile.ToString()+"字节");
139 lstAPI.Items.Add( "尚可交换文件大小为"+MemInfo.dwAvailPageFile.ToString()+"字节");
140 lstAPI.Items.Add( "总虚拟内存有"+MemInfo.dwTotalVirtual.ToString()+"字节");
141 lstAPI.Items.Add( "未用虚拟内存有"+MemInfo.dwAvailVirtual.ToString()+"字节");
142 //调用GetSystemTime函数获取系统时间信息
143 SYSTEMTIME_INFO StInfo;
144 StInfo = new SYSTEMTIME_INFO();
145 GetSystemTime(ref StInfo);
146 lstAPI.Items.Add(StInfo.wYear.ToString()+""+StInfo.wMonth.ToString()+""+StInfo.wDay.ToString()+"");
147 lstAPI.Items.Add((StInfo.wHour+8).ToString()+""+StInfo.wMinute.ToString()+""+StInfo.wSecond.ToString()+"");
148
149 }



 

posted @ 2011-11-05 09:32  幸福~伞  阅读(598)  评论(0编辑  收藏  举报