編程源碼:C#獲取系統(tǒng)軟硬件信息類介紹與實(shí)例
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
[p]所謂系統(tǒng)信息,就是計(jì)算機(jī)的軟件硬件信息,硬件如cpu主頻、網(wǎng)卡名稱等,軟件信息就如操作系統(tǒng)目錄,用戶目錄等。在平常的編程中,我們往往要用到這些系統(tǒng)信息,比如我前面的字體查看器,如果要寫個(gè)c#版,則首先要獲得系統(tǒng)字體的安裝目錄。總之,讀取系統(tǒng)信息對于編程還是很重要的,.net也不負(fù)所望,提供了很便利的方法,本文提供了四種方法來從各個(gè)方面對系統(tǒng)信息進(jìn)行讀取。[/p]
[p]第一種方法:用systeminformation 類[/p] [p]systeminformation 提供靜態(tài)方法和屬性,它們可用于獲取諸如 windows 顯示元素大小、操作系統(tǒng)設(shè)置、網(wǎng)絡(luò)可用性和系統(tǒng)中所安裝硬件的性能等信息,這種方法側(cè)重于操作系統(tǒng)(這里特指windows)的一些設(shè)置和狀態(tài)。[/p] [p]第二種方法 :用environment 類[/p] [p]通過這種方法可檢索的系統(tǒng)信息包括命令行參數(shù)、環(huán)境變量設(shè)置、調(diào)用堆棧的內(nèi)容、上次系統(tǒng)引導(dǎo)以來的時(shí)間,以及公共語言運(yùn)行庫的版本等等,測重于使用這個(gè)類的應(yīng)用程序所處的環(huán)境和狀態(tài),也有比較多的動(dòng)態(tài)信息,比如開機(jī)啟動(dòng)后的毫秒數(shù)等等。[/p] [p]第三種方法 用registrykey 類[/p] [p]這種方法方法讀取的也只能是靜態(tài)的設(shè)置,不過比上面兩種方法更加接近操作系統(tǒng),因?yàn)橹凳侵苯訌淖员碇凶x取出來的,有好處也有不好的地方,好處就是基本上可以獲得任何設(shè)置。不好的地方是不夠便利,畢竟,檢索注冊表的鍵值不如直接調(diào)用方法來得方便。[/p] [p]第四種方法 用api函數(shù)[/p] [p]這種方法嚴(yán)格說來不是用c#來實(shí)現(xiàn)對系統(tǒng)信息的讀取,因?yàn)樗鼘?shí)際調(diào)用的是系統(tǒng)api。這種方法有更加有意義的地方,就在其對api功能的調(diào)用,因而我們可以做出更多的事情。這種方法也可以在java中依樣畫胡蘆地用到。[/p] [p]下面講一下程序結(jié)構(gòu):[/p] [p]//registrykey 類所需要的包:[/p] [p]using microsoft.win32;[br]//dllimport方法所需要的包:[br]using system.runtime.interopservices;[br]//stringbuilder所需要的包:[br]using system.text;[br]//聲明api函數(shù)[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]//定義以下各結(jié)構(gòu) [br]//定義cpu的信息結(jié)構(gòu) [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]//定義內(nèi)存的信息結(jié)構(gòu) [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]//定義系統(tǒng)時(shí)間的信息結(jié)構(gòu) [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]//獲取操作系統(tǒng)設(shè)置[br]lstsysinfo.items.add("計(jì)算機(jī)名 : " + systeminformation.computername );[br]lstsysinfo.items.add("是否已連接網(wǎng)絡(luò) : " + systeminformation.network );[br]lstsysinfo.items.add("用戶域 : " + systeminformation.userdomainname ); [br]lstsysinfo.items.add("當(dāng)前線程用戶名 : " + systeminformation.username ); [br]lstsysinfo.items.add("啟動(dòng)方式 : " + systeminformation.bootmode );[br]lstsysinfo.items.add("菜單的字體 : " + systeminformation.menufont );[br]lstsysinfo.items.add("顯示器的數(shù)目 : " + systeminformation.monitorcount );[br]lstsysinfo.items.add("鼠標(biāo)已安裝 : " + systeminformation.mousepresent );[br]lstsysinfo.items.add("鼠標(biāo)按鈕數(shù) : " + systeminformation.mousebuttons); [br]lstsysinfo.items.add("是否交互模式 : " + systeminformation.userinteractive );[br]lstsysinfo.items.add("屏幕界限: " + systeminformation.virtualscreen );[br]}[br]public void initenvdata()[br]{[br][br]//獲取程序運(yùn)行的相關(guān)信息.[br]lstenv.items.add("命令行:"+ environment.commandline);[br]lstenv.items.add("命令行參數(shù):"+ string.join(", ",environment.getcommandlineargs()));[br]lstenv.items.add("當(dāng)前目錄:"+ environment.currentdirectory);[br]lstenv.items.add("操作系統(tǒng)版本:"+ environment.osversion);[br]lstenv.items.add("系統(tǒng)目錄:"+ 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("系統(tǒng)啟動(dòng)后經(jīng)過的毫秒:"+ environment.tickcount);[br]lstenv.items.add("進(jìn)程上下文的物理內(nèi)存量:"+ environment.workingset); [br]string[] drives = environment.getlogicaldrives();[br]lstenv.items.add("本機(jī)磁盤驅(qū)動(dòng)器: "+ string.join(", ", drives));[br][br]// 獲取本機(jī)所有環(huán)境變量[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("網(wǎng)卡信息:"+(string)rkey.getvalue("description"));[br]} [br]public void initapidata()[br]{[br]//調(diào)用getwindowsdirectory和getsystemdirectory函數(shù)分別取得windows路徑和系統(tǒng)路徑 [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("系統(tǒng)路徑:"+buff.tostring()); [br]//調(diào)用getsysteminfo函數(shù)獲取cpu的相關(guān)信息 [br]cpu_info cpuinfo; [br]cpuinfo = new cpu_info(); [br]getsysteminfo(ref cpuinfo); [br]//cpu信息的讀取是錯(cuò)誤的,我本只有一個(gè)cpu,讀成了兩個(gè)[br]lstapi.items.add("本計(jì)算機(jī)中有"+cpuinfo.dwnumberofprocessors.tostring()+"個(gè)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]//調(diào)用globalmemorystatus函數(shù)獲取內(nèi)存的相關(guān)信息 [br]memory_info meminfo; [br]meminfo = new memory_info(); [br]globalmemorystatus(ref meminfo); [br]lstapi.items.add( meminfo.dwmemoryload.tostring()+"%的內(nèi)存正在使用"); [br]lstapi.items.add("物理內(nèi)存共有"+meminfo.dwtotalphys.tostring()+"字節(jié)"); [br]lstapi.items.add("可使用的物理內(nèi)存有"+meminfo.dwavailphys.tostring()+"字節(jié)"); [br]lstapi.items.add( "交換文件總大小為"+meminfo.dwtotalpagefile.tostring()+"字節(jié)"); [br]lstapi.items.add( "尚可交換文件大小為"+meminfo.dwavailpagefile.tostring()+"字節(jié)"); [br]lstapi.items.add( "總虛擬內(nèi)存有"+meminfo.dwtotalvirtual.tostring()+"字節(jié)"); [br]lstapi.items.add( "未用虛擬內(nèi)存有"+meminfo.dwavailvirtual.tostring()+"字節(jié)"); [br]//調(diào)用getsystemtime函數(shù)獲取系統(tǒng)時(shí)間信息 [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()+"點(diǎn)"+stinfo.wminute.tostring()+"分"+stinfo.wsecond.tostring()+"秒"); [/p] [p]}[/p] 該文章在 2012/1/1 2:32:56 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |