`
380071587
  • 浏览: 448905 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

用C#获取CPU编号、硬盘编号等系统有关环境、属性

 
阅读更多
如果利用C#获取系统有关环境和属性,这个也是在网上问得比较多的问题,不过大部分只有提问没有回答,最近正好想做有关方面的东西,整理了一下,提供给大家,希望能给大家提供参考意见:

首先需要定义几个结构(struct),便于DllImport作为返回参数调用。以下是代码:
CpuInfo.cs

usingSystem;
usingSystem.Configuration;
usingSystem.Runtime.InteropServices;

/**//**
*LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
*注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
*LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
*LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
*/


/**////<summary>
///定义CPU的信息结构
///</summary>

[StructLayout(LayoutKind.Sequential)]
publicstructCpuInfo
...{
/**////<summary>
///OEMID
///</summary>

publicuintdwOemId;
/**////<summary>
///页面大小
///</summary>

publicuintdwPageSize;
publicuintlpMinimumApplicationAddress;
publicuintlpMaximumApplicationAddress;
publicuintdwActiveProcessorMask;
/**////<summary>
///CPU个数
///</summary>

publicuintdwNumberOfProcessors;
/**////<summary>
///CPU类型
///</summary>

publicuintdwProcessorType;
publicuintdwAllocationGranularity;
/**////<summary>
///CPU等级
///</summary>

publicuintdwProcessorLevel;
publicuintdwProcessorRevision;
}

MemoryInfo.cs
usingSystem;
usingSystem.Configuration;
usingSystem.Runtime.InteropServices;

/**//**
*LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
*注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
*LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
*LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
*/

/**////<summary>
///定义内存的信息结构
///</summary>

[StructLayout(LayoutKind.Sequential)]
publicstructMemoryInfo
...{
/**////<summary>
///
///</summary>

publicuintdwLength;
/**////<summary>
///已经使用的内存
///</summary>

publicuintdwMemoryLoad;
/**////<summary>
///总物理内存大小
///</summary>

publicuintdwTotalPhys;
/**////<summary>
///可用物理内存大小
///</summary>

publicuintdwAvailPhys;
/**////<summary>
///交换文件总大小
///</summary>

publicuintdwTotalPageFile;
/**////<summary>
///可用交换文件大小
///</summary>

publicuintdwAvailPageFile;
/**////<summary>
///总虚拟内存大小
///</summary>

publicuintdwTotalVirtual;
/**////<summary>
///可用虚拟内存大小
///</summary>

publicuintdwAvailVirtual;
}

SystemTimeInfo.cs
usingSystem;
usingSystem.Configuration;
usingSystem.Runtime.InteropServices;

/**//**
*LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
*注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
*LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
*LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
*/

/**////<summary>
///定义系统时间的信息结构
///</summary>

[StructLayout(LayoutKind.Sequential)]
publicstructSystemTimeInfo
...{
/**////<summary>
///
///</summary>

publicushortwYear;
/**////<summary>
///
///</summary>

publicushortwMonth;
/**////<summary>
///星期
///</summary>

publicushortwDayOfWeek;
/**////<summary>
///
///</summary>

publicushortwDay;
/**////<summary>
///小时
///</summary>

publicushortwHour;
/**////<summary>
///分钟
///</summary>

publicushortwMinute;
/**////<summary>
///
///</summary>

publicushortwSecond;
/**////<summary>
///毫秒
///</summary>

publicushortwMilliseconds;
}

另外还定义了一个调用类SystemInfo.cs,代码如下:
usingSystem;
usingSystem.Configuration;
usingSystem.Runtime.InteropServices;
usingSystem.Management;
usingSystem.Text;

/**////<summary>
///SystemInfo的摘要说明
///</summary>

publicclassSystemInfo
...{
privateconstintCHAR_COUNT=128;
publicSystemInfo()
...{

}

[DllImport(
"kernel32")]
privatestaticexternvoidGetWindowsDirectory(StringBuilderWinDir,intcount);

[DllImport(
"kernel32")]
privatestaticexternvoidGetSystemDirectory(StringBuilderSysDir,intcount);

[DllImport(
"kernel32")]
privatestaticexternvoidGetSystemInfo(refCpuInfocpuInfo);

[DllImport(
"kernel32")]
privatestaticexternvoidGlobalMemoryStatus(refMemoryInfomemInfo);

[DllImport(
"kernel32")]
privatestaticexternvoidGetSystemTime(refSystemTimeInfosysInfo);

/**////<summary>
///查询CPU编号
///</summary>
///<returns></returns>

publicstringGetCpuId()
...{
ManagementClassmClass
=newManagementClass("Win32_Processor");
ManagementObjectCollectionmoc
=mClass.GetInstances();
stringcpuId=null;
foreach(ManagementObjectmoinmoc)
...{
cpuId
=mo.Properties["ProcessorId"].Value.ToString();
break;
}

returncpuId;
}


/**////<summary>
///查询硬盘编号
///</summary>
///<returns></returns>

publicstringGetMainHardDiskId()
...{
ManagementObjectSearchersearcher
=newManagementObjectSearcher("SELECT*FROMWin32_PhysicalMedia");
StringhardDiskID
=null;
foreach(ManagementObjectmoinsearcher.Get())
...{
hardDiskID
=mo["SerialNumber"].ToString().Trim();
break;
}

returnhardDiskID;
}


/**////<summary>
///获取Windows目录
///</summary>
///<returns></returns>

publicstringGetWinDirectory()
...{
StringBuildersBuilder
=newStringBuilder(CHAR_COUNT);
GetWindowsDirectory(sBuilder,CHAR_COUNT);
returnsBuilder.ToString();
}


/**////<summary>
///获取系统目录
///</summary>
///<returns></returns>

publicstringGetSysDirectory()
...{
StringBuildersBuilder
=newStringBuilder(CHAR_COUNT);
GetSystemDirectory(sBuilder,CHAR_COUNT);
returnsBuilder.ToString();
}


/**////<summary>
///获取CPU信息
///</summary>
///<returns></returns>

publicCpuInfoGetCpuInfo()
...{
CpuInfocpuInfo
=newCpuInfo();
GetSystemInfo(
refcpuInfo);
returncpuInfo;
}


/**////<summary>
///获取系统内存信息
///</summary>
///<returns></returns>

publicMemoryInfoGetMemoryInfo()
...{
MemoryInfomemoryInfo
=newMemoryInfo();
GlobalMemoryStatus(
refmemoryInfo);
returnmemoryInfo;
}


/**////<summary>
///获取系统时间信息
///</summary>
///<returns></returns>

publicSystemTimeInfoGetSystemTimeInfo()
...{
SystemTimeInfosystemTimeInfo
=newSystemTimeInfo();
GetSystemTime(
refsystemTimeInfo);
returnsystemTimeInfo;
}


/**////<summary>
///获取系统名称
///</summary>
///<returns></returns>

publicstringGetOperationSystemInName()
...{
OperatingSystemos
=System.Environment.OSVersion;
stringosName="UNKNOWN";
switch(os.Platform)
...{
casePlatformID.Win32Windows:
switch(os.Version.Minor)
...{
case0:osName="Windows95";break;
case10:osName="Windows98";break;
case90:osName="WindowsME";break;
}

break;
casePlatformID.Win32NT:
switch(os.Version.Major)
...{
case3:osName="WindwsNT3.51";break;
case4:osName="WindowsNT4";break;
case5:if(os.Version.Minor==0)
...{
osName
="Windows2000";
}

elseif(os.Version.Minor==1)
...{
osName
="WindowsXP";
}

elseif(os.Version.Minor==2)
...{
osName
="WindowsServer2003";
}

break;
case6:osName="Longhorn";break;
}

break;
}

returnString.Format("{0},{1}",osName,os.Version.ToString());
}

}

以下是调用实例,为了简单,我在一个aspx页面中输出,不过这个程序可以在WinForm中调用:
usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Collections;
usingSystem.Collections.Specialized;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
usingSystem.Runtime.InteropServices;

publicpartialclassIndex:System.Web.UI.Page
...{
protectedvoidPage_Load(objectsender,EventArgse)
...{
if(!Page.IsPostBack)
...{
SystemInfosystemInfo
=newSystemInfo();
Response.Write(
"操作系统:"+systemInfo.GetOperationSystemInName()+"<br>");
Response.Write(
"CPU编号:"+systemInfo.GetCpuId()+"<br>");
Response.Write(
"硬盘编号:"+systemInfo.GetMainHardDiskId()+"<br>");
Response.Write(
"Windows目录所在位置:"+systemInfo.GetSysDirectory()+"<br>");
Response.Write(
"系统目录所在位置:"+systemInfo.GetWinDirectory()+"<br>");
MemoryInfomemoryInfo
=systemInfo.GetMemoryInfo();
CpuInfocpuInfo
=systemInfo.GetCpuInfo();
Response.Write(
"dwActiveProcessorMask"+cpuInfo.dwActiveProcessorMask+"<br>");
Response.Write(
"dwAllocationGranularity"+cpuInfo.dwAllocationGranularity+"<br>");
Response.Write(
"CPU个数:"+cpuInfo.dwNumberOfProcessors+"<br>");
Response.Write(
"OEMID:"+cpuInfo.dwOemId+"<br>");
Response.Write(
"页面大小"+cpuInfo.dwPageSize+"<br>");
Response.Write(
"CPU等级"+cpuInfo.dwProcessorLevel+"<br>");
Response.Write(
"dwProcessorRevision"+cpuInfo.dwProcessorRevision+"<br>");
Response.Write(
"CPU类型"+cpuInfo.dwProcessorType+"<br>");
Response.Write(
"lpMaximumApplicationAddress"+cpuInfo.lpMaximumApplicationAddress+"<br>");
Response.Write(
"lpMinimumApplicationAddress"+cpuInfo.lpMinimumApplicationAddress+"<br>");
Response.Write(
"CPU类型:"+cpuInfo.dwProcessorType+"<br>");
Response.Write(
"可用交换文件大小:"+memoryInfo.dwAvailPageFile+"<br>");
Response.Write(
"可用物理内存大小:"+memoryInfo.dwAvailPhys+"<br>");
Response.Write(
"可用虚拟内存大小"+memoryInfo.dwAvailVirtual+"<br>");
Response.Write(
"操作系统位数:"+memoryInfo.dwLength+"<br>");
Response.Write(
"已经使用内存大小:"+memoryInfo.dwMemoryLoad+"<br>");
Response.Write(
"交换文件总大小:"+memoryInfo.dwTotalPageFile+"<br>");
Response.Write(
"总物理内存大小:"+memoryInfo.dwTotalPhys+"<br>");
Response.Write(
"总虚拟内存大小:"+memoryInfo.dwTotalVirtual+"<br>");
}

}

}

说明:前台aspx页面没有任何控件。
分享到:
评论

相关推荐

    C#开发经验技巧宝典

    0721 如何获取CPU编号 446 0722 如何获取显示设备的PNPDeviceID 447 0723 如何获取声音设备的PNPDeviceID 447 0724 如何获取硬盘编号 447 0725 如何获取CPU的版本信息 448 0726 如何获取CPU的产品名称...

    C#编程经验技巧宝典

    C#编程经验技巧宝典源代码,目录如下: 第1章 开发环境 1 &lt;br&gt;1.1 Visual Studio开发环境安装与配置 2 &lt;br&gt;0001 安装Visual Studio 2005开发环境须知 2 &lt;br&gt;0002 配置合适的Visual Studio 2005...

    C#.net_经典编程例子400个

    273 实例190 获取窗口文本 273 实例191 判断文件是否正在被使用 274 实例192 在程序中调用.HLP文件 275 实例193 C#中实现文件拖放 276 实例194 文件比较 276 第7章 操作系统与Windows...

    C#程序开发范例宝典(第2版).part08

    实例253 CPU使用率 348 7.7 系统软件信息 350 实例254 获取计算机中已安装的字体 350 实例255 获取计算机的显示设备信息 351 实例256 获取系统启动后经过的时间 351 实例257 系统已经安装的打印机信息 352 ...

    C#程序开发范例宝典(第2版).part02

    实例253 CPU使用率 348 7.7 系统软件信息 350 实例254 获取计算机中已安装的字体 350 实例255 获取计算机的显示设备信息 351 实例256 获取系统启动后经过的时间 351 实例257 系统已经安装的打印机信息 352 ...

    C#程序开发范例宝典(第2版).part12

    实例253 CPU使用率 348 7.7 系统软件信息 350 实例254 获取计算机中已安装的字体 350 实例255 获取计算机的显示设备信息 351 实例256 获取系统启动后经过的时间 351 实例257 系统已经安装的打印机信息 352 ...

    C#程序开发范例宝典(第2版).part13

    实例253 CPU使用率 348 7.7 系统软件信息 350 实例254 获取计算机中已安装的字体 350 实例255 获取计算机的显示设备信息 351 实例256 获取系统启动后经过的时间 351 实例257 系统已经安装的打印机信息 352 ...

Global site tag (gtag.js) - Google Analytics