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