如果利用C#获取系统有关环境和属性,这个也是在网上问得比较多的问题,不过大部分只有提问没有回答,最近正好想做有关方面的东西,整理了一下,提供给大家,希望能给大家提供参考意见:首先需要定义几个结构(struct) ,便于DllImport作为返回参数调用。以下是代码:
CpuInfo.csusing System;
using System.Configuration;
using System.Runtime.InteropServices;/**//**
* LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
* 注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
* LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
* LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
*/
/**//// <summary>
/// 定义CPU的信息结构
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct CpuInfo
...{
/**//// <summary>
/// OEM ID
/// </summary>
public uint dwOemId;
/**//// <summary>
/// 页面大小
/// </summary>
public uint dwPageSize;
public uint lpMinimumApplicationAddress;
public uint lpMaximumApplicationAddress;
public uint dwActiveProcessorMask;
/**//// <summary>
/// CPU个数
/// </summary>
public uint dwNumberOfProcessors;
/**//// <summary>
/// CPU类型
/// </summary>
public uint dwProcessorType;
public uint dwAllocationGranularity;
/**//// <summary>
/// CPU等级
/// </summary>
public uint dwProcessorLevel;
public uint dwProcessorRevision;
}
MemoryInfo.cs
using System;
using System.Configuration;
using System.Runtime.InteropServices;/**//**
* LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
* 注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
* LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
* LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
*/
/**//// <summary>
/// 定义内存的信息结构
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct MemoryInfo
...{
/**//// <summary>
///
/// </summary>
public uint dwLength;
/**//// <summary>
/// 已经使用的内存
/// </summary>
public uint dwMemoryLoad;
/**//// <summary>
/// 总物理内存大小
/// </summary>
public uint dwTotalPhys;
/**//// <summary>
/// 可用物理内存大小
/// </summary>
public uint dwAvailPhys;
/**//// <summary>
/// 交换文件总大小
/// </summary>
public uint dwTotalPageFile;
/**//// <summary>
/// 可用交换文件大小
/// </summary>
public uint dwAvailPageFile;
/**//// <summary>
/// 总虚拟内存大小
/// </summary>
public uint dwTotalVirtual;
/**//// <summary>
/// 可用虚拟内存大小
/// </summary>
public uint dwAvailVirtual;
}
CpuInfo.csusing System;
using System.Configuration;
using System.Runtime.InteropServices;/**//**
* LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
* 注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
* LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
* LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
*/
/**//// <summary>
/// 定义CPU的信息结构
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct CpuInfo
...{
/**//// <summary>
/// OEM ID
/// </summary>
public uint dwOemId;
/**//// <summary>
/// 页面大小
/// </summary>
public uint dwPageSize;
public uint lpMinimumApplicationAddress;
public uint lpMaximumApplicationAddress;
public uint dwActiveProcessorMask;
/**//// <summary>
/// CPU个数
/// </summary>
public uint dwNumberOfProcessors;
/**//// <summary>
/// CPU类型
/// </summary>
public uint dwProcessorType;
public uint dwAllocationGranularity;
/**//// <summary>
/// CPU等级
/// </summary>
public uint dwProcessorLevel;
public uint dwProcessorRevision;
}
MemoryInfo.cs
using System;
using System.Configuration;
using System.Runtime.InteropServices;/**//**
* LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
* 注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
* LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
* LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
*/
/**//// <summary>
/// 定义内存的信息结构
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct MemoryInfo
...{
/**//// <summary>
///
/// </summary>
public uint dwLength;
/**//// <summary>
/// 已经使用的内存
/// </summary>
public uint dwMemoryLoad;
/**//// <summary>
/// 总物理内存大小
/// </summary>
public uint dwTotalPhys;
/**//// <summary>
/// 可用物理内存大小
/// </summary>
public uint dwAvailPhys;
/**//// <summary>
/// 交换文件总大小
/// </summary>
public uint dwTotalPageFile;
/**//// <summary>
/// 可用交换文件大小
/// </summary>
public uint dwAvailPageFile;
/**//// <summary>
/// 总虚拟内存大小
/// </summary>
public uint dwTotalVirtual;
/**//// <summary>
/// 可用虚拟内存大小
/// </summary>
public uint dwAvailVirtual;
}
解决方案 »
- 求助高手,devexpress的gridcontrol控件( 如何控制某列只能输入正数)
- 空DataSet怎么初始化
- GDI+图片移动的问题
- 启动进程sqlservr时,弹出dos窗口怎么办啊,大侠救我啊
- C# 数据读取遇到的问题
- 请教打印预览问题
- ASP.net用C#,有没有动态建立数据库表的方法
- OOP:如何定制契约,可以规定子类必须实现某些static的方法?
- 看了 Petshop 3.0 几个文件 , 如 DataProtector.cs , 信心一下子全没有了,太难懂了 , 高手 指点 !!! up 有分 ----
- 请教高手:我的datagrid的DataSource是一个dataview(动态筛选)我怎么才能得到当前的datagrid的数据?
- 怎样获得ComboBox中选中项的文本
- 菜鸟急求:vs2005 C#连接access数据库的winform添加删除的实例,数据写入不到数据库?
using System;
using System.Configuration;
using System.Runtime.InteropServices;/**//**
* LayoutKind.Automatic:为了提高效率允许运行态对类型成员重新排序
* 注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。
* LayoutKind.Explicit:对每个域按照FieldOffset属性对类型成员排序
* LayoutKind.Sequential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。
*/
/**//// <summary>
/// 定义系统时间的信息结构
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct SystemTimeInfo
...{
/**//// <summary>
/// 年
/// </summary>
public ushort wYear;
/**//// <summary>
/// 月
/// </summary>
public ushort wMonth;
/**//// <summary>
/// 星期
/// </summary>
public ushort wDayOfWeek;
/**//// <summary>
/// 天
/// </summary>
public ushort wDay;
/**//// <summary>
/// 小时
/// </summary>
public ushort wHour;
/**//// <summary>
/// 分钟
/// </summary>
public ushort wMinute;
/**//// <summary>
/// 秒
/// </summary>
public ushort wSecond;
/**//// <summary>
/// 毫秒
/// </summary>
public ushort wMilliseconds;
}
另外还定义了一个调用类SystemInfo.cs,代码如下:
using System;
using System.Configuration;
using System.Runtime.InteropServices;
using System.Management;
using System.Text;/**//// <summary>
/// SystemInfo 的摘要说明
/// </summary>
public class SystemInfo
...{
private const int CHAR_COUNT = 128;
public SystemInfo()
...{
}
[DllImport("kernel32")]
private static extern void GetWindowsDirectory(StringBuilder WinDir, int count); [DllImport("kernel32")]
private static extern void GetSystemDirectory(StringBuilder SysDir, int count); [DllImport("kernel32")]
private static extern void GetSystemInfo(ref CpuInfo cpuInfo); [DllImport("kernel32")]
private static extern void GlobalMemoryStatus(ref MemoryInfo memInfo); [DllImport("kernel32")]
private static extern void GetSystemTime(ref SystemTimeInfo sysInfo); /**//// <summary>
/// 查询CPU编号
/// </summary>
/// <returns></returns>
public string GetCpuId()
...{
ManagementClass mClass = new ManagementClass("Win32_Processor");
ManagementObjectCollection moc = mClass.GetInstances();
string cpuId=null;
foreach (ManagementObject mo in moc)
...{
cpuId = mo.Properties["ProcessorId"].Value.ToString();
break;
}
return cpuId;
} /**//// <summary>
/// 查询硬盘编号
/// </summary>
/// <returns></returns>
public string GetMainHardDiskId()
...{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");
String hardDiskID=null;
foreach (ManagementObject mo in searcher.Get())
...{
hardDiskID = mo["SerialNumber"].ToString().Trim();
break;
}
return hardDiskID;
} /**//// <summary>
/// 获取Windows目录
/// </summary>
/// <returns></returns>
public string GetWinDirectory()
...{
StringBuilder sBuilder = new StringBuilder(CHAR_COUNT);
GetWindowsDirectory(sBuilder, CHAR_COUNT);
return sBuilder.ToString();
} /**//// <summary>
/// 获取系统目录
/// </summary>
/// <returns></returns>
public string GetSysDirectory()
...{
StringBuilder sBuilder = new StringBuilder(CHAR_COUNT);
GetSystemDirectory(sBuilder, CHAR_COUNT);
return sBuilder.ToString();
} /**//// <summary>
/// 获取CPU信息
/// </summary>
/// <returns></returns>
public CpuInfo GetCpuInfo()
...{
CpuInfo cpuInfo = new CpuInfo();
GetSystemInfo(ref cpuInfo);
return cpuInfo;
} /**//// <summary>
/// 获取系统内存信息
/// </summary>
/// <returns></returns>
public MemoryInfo GetMemoryInfo()
...{
MemoryInfo memoryInfo = new MemoryInfo();
GlobalMemoryStatus(ref memoryInfo);
return memoryInfo;
} /**//// <summary>
/// 获取系统时间信息
/// </summary>
/// <returns></returns>
public SystemTimeInfo GetSystemTimeInfo()
...{
SystemTimeInfo systemTimeInfo = new SystemTimeInfo();
GetSystemTime(ref systemTimeInfo);
return systemTimeInfo;
} /**//// <summary>
/// 获取系统名称
/// </summary>
/// <returns></returns>
public string GetOperationSystemInName()
...{
OperatingSystem os = System.Environment.OSVersion;
string osName = "UNKNOWN";
switch (os.Platform)
...{
case PlatformID.Win32Windows:
switch (os.Version.Minor)
...{
case 0: osName = "Windows 95"; break;
case 10: osName = "Windows 98"; break;
case 90: osName = "Windows ME"; break;
}
break;
case PlatformID.Win32NT:
switch (os.Version.Major)
...{
case 3: osName = "Windws NT 3.51"; break;
case 4: osName = "Windows NT 4"; break;
case 5: if (os.Version.Minor == 0)
...{
osName = "Windows 2000";
}
else if (os.Version.Minor == 1)
...{
osName = "Windows XP";
}
else if (os.Version.Minor == 2)
...{
osName = "Windows Server 2003";
}
break;
case 6: osName = "Longhorn"; break;
}
break;
}
return String.Format("{0},{1}", osName, os.Version.ToString());
}
}
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Collections.Specialized;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Runtime.InteropServices;public partial class Index : System.Web.UI.Page
...{
protected void Page_Load(object sender, EventArgs e)
...{
if (!Page.IsPostBack)
...{
SystemInfo systemInfo = new SystemInfo();
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>");
MemoryInfo memoryInfo = systemInfo.GetMemoryInfo();
CpuInfo cpuInfo = systemInfo.GetCpuInfo();
Response.Write("dwActiveProcessorMask" + cpuInfo.dwActiveProcessorMask + "<br>");
Response.Write("dwAllocationGranularity" + cpuInfo.dwAllocationGranularity + "<br>");
Response.Write("CPU个数:" + cpuInfo.dwNumberOfProcessors + "<br>");
Response.Write("OEM ID:" + 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页面没有任何控件。------------------------------------------
完整内容请见:
http://blog.csdn.net/zhoufoxcn/archive/2007/03/20/1534949.aspx
不知道c#有没有不用api的~~~~贪心呀:)
Environment.SystemDirectory;
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
系统应该将 zhoufoxcn (执子之手) 归入VIP!!
将zhoufoxcn (执子之手)的社会信用度提高9999999999%
允许zhoufoxcn (执子之手)贷款不还
授予zhoufoxcn (执子之手)国家英雄称号
奖励zhoufoxcn (执子之手)北京三居室三套(位置自选)
获取系统路径.net的方法
Environment.SystemDirectory;
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
===============================================================
这种办法是最直接的,我平常也是用这种办法,这里不过是提出另一种办法供大家参考。
不知道c#有没有不用api的~~~~贪心呀:)
==================================不用API的话用WMI应该可以实现类似的功能,正在研究中,已经小有收获。如果大有收获的话,我还会吐血奉献一次的:)
桌面常伴,Win32API大全~~~~~ 使你不再吐血
WIN32的API会逐渐消失.那么用什么编程系统基层的东西?这些C#并不擅长
用.NETFRAMWORK的类库么?WIN32 API编程还能走多远.?
硬盘情况查阅;Win32_DiskDrive
内存情况查阅:Win32_MemoryArray
CPU情况查阅:Win32_Processor简单示例 -- 罗列本机CPU信息
// ProcessorInfo.cs
// Author by Yzl
using System;
using System.Management;
public class ProcessorInfo
{
public static void Main(string[] args)
{
ManagementClass processorCls = new ManagementClass("Win32_Processor");
// 罗列CPU处理器的信息
foreach(ManagementObject processorObj in processorCls.GetInstances())
{
Console.WriteLine("Processor Id:"+processorObj["ProcessorId"]);
Console.WriteLine("Processor Name:" + processorObj["Name"]);
Console.WriteLine("Current Clock Speed:" + processorObj["CurrentClockSpeed"]);
}
}
}
详细请查阅:http://blog.csdn.net/yuzl32/archive/2007/03/12/1527384.aspx
我代表党中央、国务院感谢你!因为对WMI不熟悉(刚接触),所以还不太了解。
同时感谢各位XDJM的支持。