用Visual C#擷取系統資訊四法

來源:互聯網
上載者:User
用Visual C#擷取系統資訊四法2007-12-07 13:30
第一種方法:用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()+"秒");

       }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.