编程源码:C#获取系统软硬件信息类介绍与实例
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
[p]所谓系统信息,就是计算机的软件硬件信息,硬件如cpu主频、网卡名称等,软件信息就如操作系统目录,用户目录等。在平常的编程中,我们往往要用到这些系统信息,比如我前面的字体查看器,如果要写个c#版,则首先要获得系统字体的安装目录。总之,读取系统信息对于编程还是很重要的,.net也不负所望,提供了很便利的方法,本文提供了四种方法来从各个方面对系统信息进行读取。[/p]
[p]第一种方法:用systeminformation 类[/p] [p]systeminformation 提供静态方法和属性,它们可用于获取诸如 windows 显示元素大小、操作系统设置、网络可用性和系统中所安装硬件的性能等信息,这种方法侧重于操作系统(这里特指windows)的一些设置和状态。[/p] [p]第二种方法 :用environment 类[/p] [p]通过这种方法可检索的系统信息包括命令行参数、环境变量设置、调用堆栈的内容、上次系统引导以来的时间,以及公共语言运行库的版本等等,测重于使用这个类的应用程序所处的环境和状态,也有比较多的动态信息,比如开机启动后的毫秒数等等。[/p] [p]第三种方法 用registrykey 类[/p] [p]这种方法方法读取的也只能是静态的设置,不过比上面两种方法更加接近操作系统,因为值是直接从注册表中读取出来的,有好处也有不好的地方,好处就是基本上可以获得任何设置。不好的地方是不够便利,毕竟,检索注册表的键值不如直接调用方法来得方便。[/p] [p]第四种方法 用api函数[/p] [p]这种方法严格说来不是用c#来实现对系统信息的读取,因为它实际调用的是系统api。这种方法有更加有意义的地方,就在其对api功能的调用,因而我们可以做出更多的事情。这种方法也可以在java中依样画胡芦地用到。[/p] [p]下面讲一下程序结构:[/p] [p]//registrykey 类所需要的包:[/p] [p]using microsoft.win32;[br]//dllimport方法所需要的包:[br]using system.runtime.interopservices;[br]//stringbuilder所需要的包:[br]using system.text;[br]//声明api函数[br][dllimport("kernel32")] [br]public static extern void getwindowsdirectory(stringbuilder windir,int count); [br][dllimport("kernel32")] [br]public static extern void getsystemdirectory(stringbuilder sysdir,int count); [br][dllimport("kernel32")] [br]public static extern void getsysteminfo(ref cpu_info cpuinfo); [br][dllimport("kernel32")] [br]public static extern void globalmemorystatus(ref memory_info meminfo); [br][dllimport("kernel32")] [br]public static extern void getsystemtime(ref systemtime_info stinfo); [br]//定义以下各结构 [br]//定义cpu的信息结构 [br][structlayout(layoutkind.sequential)] [br]public struct cpu_info [br]{ [br]public uint dwoemid; [br]public uint dwpagesize; [br]public uint lpminimumapplicationaddress; [br]public uint lpmaximumapplicationaddress; [br]public uint dwactiveprocessormask; [br]public uint dwnumberofprocessors; [br]public uint dwprocessortype; [br]public uint dwallocationgranularity; [br]public uint dwprocessorlevel; [br]public uint dwprocessorrevision; [br]} [br]//定义内存的信息结构 [br][structlayout(layoutkind.sequential)] [br]public struct memory_info [br]{ [br]public uint dwlength; [br]public uint dwmemoryload; [br]public uint dwtotalphys; [br]public uint dwavailphys; [br]public uint dwtotalpagefile; [br]public uint dwavailpagefile; [br]public uint dwtotalvirtual; [br]public uint dwavailvirtual; [br]} [br]//定义系统时间的信息结构 [br][structlayout(layoutkind.sequential)] [br]public struct systemtime_info [br]{ [br]public ushort wyear; [br]public ushort wmonth; [br]public ushort wdayofweek; [br]public ushort wday; [br]public ushort whour; [br]public ushort wminute; [br]public ushort wsecond; [br]public ushort wmilliseconds; [br]}[br]private void initsysinfodata()[br]{[br]//获取操作系统设置[br]lstsysinfo.items.add("计算机名 : " + systeminformation.computername );[br]lstsysinfo.items.add("是否已连接网络 : " + systeminformation.network );[br]lstsysinfo.items.add("用户域 : " + systeminformation.userdomainname ); [br]lstsysinfo.items.add("当前线程用户名 : " + systeminformation.username ); [br]lstsysinfo.items.add("启动方式 : " + systeminformation.bootmode );[br]lstsysinfo.items.add("菜单的字体 : " + systeminformation.menufont );[br]lstsysinfo.items.add("显示器的数目 : " + systeminformation.monitorcount );[br]lstsysinfo.items.add("鼠标已安装 : " + systeminformation.mousepresent );[br]lstsysinfo.items.add("鼠标按钮数 : " + systeminformation.mousebuttons); [br]lstsysinfo.items.add("是否交互模式 : " + systeminformation.userinteractive );[br]lstsysinfo.items.add("屏幕界限: " + systeminformation.virtualscreen );[br]}[br]public void initenvdata()[br]{[br][br]//获取程序运行的相关信息.[br]lstenv.items.add("命令行:"+ environment.commandline);[br]lstenv.items.add("命令行参数:"+ string.join(", ",environment.getcommandlineargs()));[br]lstenv.items.add("当前目录:"+ environment.currentdirectory);[br]lstenv.items.add("操作系统版本:"+ environment.osversion);[br]lstenv.items.add("系统目录:"+ environment.systemdirectory);[br]lstenv.items.add("堆栈信息:"+ environment.stacktrace);[br]lstenv.items.add("用户域:"+ environment.userdomainname);[br]lstenv.items.add("clr版本:"+ environment.version);[br]lstenv.items.add("系统启动后经过的毫秒:"+ environment.tickcount);[br]lstenv.items.add("进程上下文的物理内存量:"+ environment.workingset); [br]string[] drives = environment.getlogicaldrives();[br]lstenv.items.add("本机磁盘驱动器: "+ string.join(", ", drives));[br][br]// 获取本机所有环境变量[br]idictionary environmentvariables = environment.getenvironmentvariables();[br]foreach (dictionaryentry de in environmentvariables)[br]{[br]lstenv.items.add(de.key+"="+de.value);[br]}[br][br]}[br]public void initregkeydata()[br]{[br]//通过注册表获取信息[br]registrykey rkey = registry.localmachine;[br]rkey = rkey.opensubkey("hardware\\description\\system\\centralprocessor\\0");[br]lstregkey.items.add("处理器信息:"+rkey.getvalue("processornamestring").tostring().trim());[br][br]rkey=registry.localmachine;[br]rkey = rkey.opensubkey("software\\microsoft\\windows nt\\currentversion\\networkcards\\1");[br]lstregkey.items.add("网卡信息:"+(string)rkey.getvalue("description"));[br]} [br]public void initapidata()[br]{[br]//调用getwindowsdirectory和getsystemdirectory函数分别取得windows路径和系统路径 [br]const int nchars = 128; [br]stringbuilder buff = new stringbuilder(nchars); [br]getwindowsdirectory(buff,nchars); [br]lstapi.items.add("windows路径:"+buff.tostring()); [br]getsystemdirectory(buff,nchars); [br]lstapi.items.add("系统路径:"+buff.tostring()); [br]//调用getsysteminfo函数获取cpu的相关信息 [br]cpu_info cpuinfo; [br]cpuinfo = new cpu_info(); [br]getsysteminfo(ref cpuinfo); [br]//cpu信息的读取是错误的,我本只有一个cpu,读成了两个[br]lstapi.items.add("本计算机中有"+cpuinfo.dwnumberofprocessors.tostring()+"个cpu"); [br]lstapi.items.add("cpu的类型为"+cpuinfo.dwprocessortype.tostring()); [br]lstapi.items.add("cpu等级为"+cpuinfo.dwprocessorlevel.tostring()); [br]lstapi.items.add("cpu的oem id为"+cpuinfo.dwoemid.tostring()); [br]lstapi.items.add("cpu中的页面大小为"+cpuinfo.dwpagesize.tostring()); [br]//调用globalmemorystatus函数获取内存的相关信息 [br]memory_info meminfo; [br]meminfo = new memory_info(); [br]globalmemorystatus(ref meminfo); [br]lstapi.items.add( meminfo.dwmemoryload.tostring()+"%的内存正在使用"); [br]lstapi.items.add("物理内存共有"+meminfo.dwtotalphys.tostring()+"字节"); [br]lstapi.items.add("可使用的物理内存有"+meminfo.dwavailphys.tostring()+"字节"); [br]lstapi.items.add( "交换文件总大小为"+meminfo.dwtotalpagefile.tostring()+"字节"); [br]lstapi.items.add( "尚可交换文件大小为"+meminfo.dwavailpagefile.tostring()+"字节"); [br]lstapi.items.add( "总虚拟内存有"+meminfo.dwtotalvirtual.tostring()+"字节"); [br]lstapi.items.add( "未用虚拟内存有"+meminfo.dwavailvirtual.tostring()+"字节"); [br]//调用getsystemtime函数获取系统时间信息 [br]systemtime_info stinfo; [br]stinfo = new systemtime_info(); [br]getsystemtime(ref stinfo); [br]lstapi.items.add(stinfo.wyear.tostring()+"年"+stinfo.wmonth.tostring()+"月"+stinfo.wday.tostring()+"日"); [br]lstapi.items.add((stinfo.whour+8).tostring()+"点"+stinfo.wminute.tostring()+"分"+stinfo.wsecond.tostring()+"秒"); [/p] [p]}[/p] 该文章在 2012/1/1 2:32:56 编辑过 |
关键字查询
相关文章
正在查询... |