第一種方法:用SystemInformation 類
SystemInformation 提供靜態方法和屬性,它們可用於擷取諸如 Windows 顯示元素大小、作業系統設定、網路可用性和系統中所安裝硬體的效能等資訊,這種方法側重於作業系統(這裡特指Windows)的一些設定和狀態。 第二種方法 :用Environment 類
通過這種方法可檢索的系統資訊包括命令列參數、環境變數設定、呼叫堆疊的內容、上次系統引導以來的時間,以及公用語言運行庫的版本等等,測重於使用這個類的應用程式所處的環境和狀態,也有比較多的動態資訊,比如開機啟動後的毫秒數等等。 第三種方法 用RegistryKey 類
這種方法方法讀取的也只能是靜態設定,不過比上面兩種方法更加接近作業系統,因為值是直接從註冊表中讀取出來的,有好處也有不好的地方,好處就是基本上可以獲得任何設定。不好的地方是不夠便利,畢竟,檢索註冊表的索引值不如直接調用方法來得方便。 第四種方法 用API函數
這種方法嚴格說來不是用C#來實現對系統資訊的讀取,因為它實際調用的是系統API。這種方法有更加有意義的地方,就在其對API功能的調用,因而我們可以做出更多的事情。這種方法也可以在Java中依樣畫胡蘆地用到。 下面講一下程式結構: //RegistryKey 類所需要的包: using Microsoft.Win32; //DllImport方法所需要的包: using System.Runtime.InteropServices; //StringBuilder所需要的包: using System.Text; //聲明API函數 [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); //定義以下各結構 //定義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; } //定義記憶體的資訊結構 [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; } //定義系統時間的資訊結構 [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() { //擷取作業系統設定 lstSysInfo.Items.Add("電腦名稱 : " + SystemInformation.ComputerName ); lstSysInfo.Items.Add("是否已串連網路 : " + SystemInformation.Network ); lstSysInfo.Items.Add("使用者域 : " + SystemInformation.UserDomainName ); lstSysInfo.Items.Add("當前線程使用者名稱 : " + SystemInformation.UserName ); lstSysInfo.Items.Add("啟動方式 : " + SystemInformation.BootMode ); lstSysInfo.Items.Add("菜單的字型 : " + SystemInformation.MenuFont ); lstSysInfo.Items.Add("顯示器的數目 : " + SystemInformation.MonitorCount ); lstSysInfo.Items.Add("滑鼠已安裝 : " + SystemInformation.MousePresent ); lstSysInfo.Items.Add("滑鼠按鍵數 : " + SystemInformation.MouseButtons); lstSysInfo.Items.Add("是否互動模式 : " + SystemInformation.UserInteractive ); lstSysInfo.Items.Add("螢幕界限: " + SystemInformation.VirtualScreen ); } public void initEnvData() { //擷取程式啟動並執行相關資訊. lstEnv.Items.Add("命令列:"+ Environment.CommandLine); lstEnv.Items.Add("命令列參數:"+ String.Join(", ",Environment.GetCommandLineArgs())); lstEnv.Items.Add("目前的目錄:"+ Environment.CurrentDirectory); lstEnv.Items.Add("作業系統版本:"+ Environment.OSVersion); lstEnv.Items.Add("系統目錄:"+ Environment.SystemDirectory); lstEnv.Items.Add("堆棧資訊:"+ Environment.StackTrace); lstEnv.Items.Add("使用者域:"+ Environment.UserDomainName); lstEnv.Items.Add("CLR版本:"+ Environment.Version); lstEnv.Items.Add("系統啟動後經過的毫秒:"+ Environment.TickCount); lstEnv.Items.Add("進程內容相關的實體記憶體量:"+ Environment.WorkingSet); String[] drives = Environment.GetLogicalDrives(); lstEnv.Items.Add("本機磁碟機: "+ String.Join(", ", drives)); // 擷取本機所有環境變數 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("網卡資訊:"+(String)Rkey.GetValue("Description")); } public void initAPIData() { //調用GetWindowsDirectory和GetSystemDirectory函數分別取得Windows路徑和系統路徑 const int nChars = 128; StringBuilder Buff = new StringBuilder(nChars); GetWindowsDirectory(Buff,nChars); lstAPI.Items.Add("Windows路徑:"+Buff.ToString()); GetSystemDirectory(Buff,nChars); lstAPI.Items.Add("系統路徑:"+Buff.ToString()); //調用GetSystemInfo函數擷取CPU的相關資訊 CPU_INFO CpuInfo; CpuInfo = new CPU_INFO(); GetSystemInfo(ref CpuInfo); //CPU資訊的讀取是錯誤的,我本只有一個CPU,讀成了兩個 lstAPI.Items.Add("本電腦中有"+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()); //調用GlobalMemoryStatus函數擷取記憶體的相關資訊 MEMORY_INFO MemInfo; MemInfo = new MEMORY_INFO(); GlobalMemoryStatus(ref MemInfo); lstAPI.Items.Add( MemInfo.dwMemoryLoad.ToString()+"%的記憶體正在使用"); lstAPI.Items.Add("實體記憶體共有"+MemInfo.dwTotalPhys.ToString()+"位元組"); lstAPI.Items.Add("可使用的實體記憶體有"+MemInfo.dwAvailPhys.ToString()+"位元組"); lstAPI.Items.Add( "分頁檔總大小為"+MemInfo.dwTotalPageFile.ToString()+"位元組"); lstAPI.Items.Add( "尚可分頁檔大小為"+MemInfo.dwAvailPageFile.ToString()+"位元組"); lstAPI.Items.Add( "總虛擬記憶體有"+MemInfo.dwTotalVirtual.ToString()+"位元組"); lstAPI.Items.Add( "未用虛擬記憶體有"+MemInfo.dwAvailVirtual.ToString()+"位元組"); //調用GetSystemTime函數擷取系統時間資訊 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()+"點"+StInfo.wMinute.ToString()+"分"+StInfo.wSecond.ToString()+"秒"); } |