下面是我写的简单的系统属性查看器(C#/WPF)
注意:
程序全部用托管代码实现,主要查询依赖WMI.NET,因此示例代码运行需要引用System.Windows.Management.dll,并需在代码开头加入:using System.Management; 命名空间。
文章需要读者对WMI有基本了解。
推荐参考的链接:
WMI.NET概述:http://msdn.microsoft.com/en-us/library/ms257340(v=VS.80).aspx
WMI Win32类:http://msdn.microsoft.com/en-us/library/aa394084.aspx
下载程序或源代码
点击下载
(此为微软SkyDrive存档,请用浏览器直接下载,用某些下载工具可能无法下载)
程序环境:.NET Framework 4.0 Client Profile
源代码环境:Visual C# 2010 Express SP1
注意:
程序的源代码主要执行函数是用中文写的,代表功能一目了然,因此就不一一介绍所有函数了,文章下面只会写一些需要注意的地方!
目录
- 判断处理器架构
- 判断内存类型
- 判断内存大小
- 判断显卡名称
- 判断计算机工作组
返回目录
判断处理器架构
首先我想到的还是用WMI,于是参考WMI类中的Win32_Processor里的Architecture属性,MSDN里清楚地阐述了这个属性各种值的具体意义(地址:http://msdn.microsoft.com/en-us/library/aa394373(v=VS.85).aspx)。比如32位/64位/PowerPC架构等,非常强大。于是我写出如下WMI查询代码:
static ManagementObjectSearcher Processor = new ManagementObjectSearcher("select * from Win32_Processor");
public static string 系统类型()
{
var val = (ushort)GetValue(Processor, "Architecture");
switch (val)
{
case 0:
return "32位";
case 1:
return "MIPS";
case 2:
return "Alpha";
case 3:
return "PowerPC";
case 6:
return "基于Itanium";
case 9:
return "64位";
default:
return "无法识别";
}
}
static object GetValue(ManagementObjectSearcher searcher, string propName)
{
foreach (ManagementObject mobj in searcher.Get())
return mobj[propName];
throw new NotSupportedException();
}
可结果在我的32位Win7上运行竟然返回是64位,始终不解……(贴在上面,谁可以解释一下求教导)
查阅资料,才知.NET 4.0中Environment类中有判读64位系统的直接属性,直接用它:
public static string 系统类型()
{
return Environment.Is64BitOperatingSystem ? "64位" : "32位";
}
不过貌似现在.NET 4.0还不是很普及哈(可能有人此时会对着屏幕说:“其实.NET就根本没有普及过”……呵呵,,,扯远了),总之如果不是.NET 4.0环境,我们依然可以通过系统环境变量:PROCESSOR_ARCHITECHTURE来判断,参考这篇文章(http://msdn.microsoft.com/en-us/library/aa384274.aspx),我写出如下代码:
public static string 系统类型()
{
var val = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE", EnvironmentVariableTarget.Machine);
//貌似可能的值是:x86, x64, AMD64, IA64
if (val.Contains("86"))
return "32位";
if (val.Contains("64"))
return "64位";
//如果不属于这些值,我就不瞎翻译了,返回人家原值
return val;
}
返回目录
判断内存类型
定义在WMI中Win32_PhysicalMemory的MemoryType属性,不过目前还不能直接判断DDR3的类型,DDR3内存会返回0(代表未知类型)可以参考:http://msdn.microsoft.com/en-us/library/aa394347(v=VS.85).aspx
测试代码:(下面switch中仅列出常见类型,你可以参考MSDN链接并加入更多的内存判断支持)
static ManagementObjectSearcher PhysicalMemory = new ManagementObjectSearcher("select * from Win32_PhysicalMemory");
public static string 内存类型()
{
var val = (ushort)GetValue(PhysicalMemory, "MemoryType");
switch (val)
{
case 0:
return "未知(可能是DDR3)";
case 2:
return "DRAM";
case 17:
return "SDRAM";
case 20:
return "DDR";
case 21:
return "DDR2";
default:
return "未知类型";
}
}
static object GetValue(ManagementObjectSearcher searcher, string propName)
{
foreach (ManagementObject mobj in searcher.Get())
return mobj[propName];
throw new NotSupportedException();
}
返回目录
判断内存大小
或许你已经查询过.NET(C#)判断物理内存大小的方法,但网上大多数方式是调用GlobalMemoryStatus Win32 API或者是应用 Microsoft.VisualBasic.dll并使用其中的Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory属性。可以看着个网页(http://stackoverflow.com/questions/105031/c-how-do-you-get-total-amount-of-ram-the-computer-has)但是这两种方法,一种需要P/Invoke,另一种可能在C#下去使用VB的类库,虽然针对.NET的类库都是通用的跨语言的,但还是不舒服的(就像在WPF下引用Windows Forms的类库),还是我上面所推荐的,这种操作能用.NET中内置的就用它,如果没有,WMI.NET还是比较天然的选择。
当然,无论那种方法都可以正确得到结果的。
下面贴出WMI查询代码,其实一点也不复杂,就是用Win32_PhysicalMemory 类的Capacity属性:
static ManagementObjectSearcher PhysicalMemory = new ManagementObjectSearcher("select * from Win32_PhysicalMemory");
public static string 物理内存()
{
//除两个1024 将 字节转换成兆字节(byte -> MB)
return String.Format("{0} MB", Convert.ToInt64(GetValue(PhysicalMemory, "Capacity")) / 1024 / 1024);
}
static object GetValue(ManagementObjectSearcher searcher, string propName)
{
foreach (ManagementObject mobj in searcher.Get())
return mobj[propName];
throw new NotSupportedException();
}
在我的电脑,输出2048 MB(2GB)
返回目录
判断显卡名称
WMI的Win32_VideoController的Caption属性,MSDN(http://msdn.microsoft.com/en-us/library/aa394512(v=VS.85).aspx)static ManagementObjectSearcher VideoController = new ManagementObjectSearcher("select * from Win32_VideoController");
public static string 显卡名称()
{
return (string)GetValue(VideoController, "Caption");
}
static object GetValue(ManagementObjectSearcher searcher, string propName)
{
foreach (ManagementObject mobj in searcher.Get())
return mobj[propName];
throw new NotSupportedException();
}
返回目录
判断计算机工作组
.NET中System.Environment类中并没有获取计算机工作组(Workgroup)的属性,只能通过WMI的Win32_ComputerSystem的Workgroup属性来获取(MSDN:http://msdn.microsoft.com/en-us/library/aa394102(v=VS.85).aspx)
static ManagementObjectSearcher CompSys = new ManagementObjectSearcher("select * from Win32_ComputerSystem");
public static string 工作组()
{
return (string)GetValue(CompSys, "Workgroup");
}
static object GetValue(ManagementObjectSearcher searcher, string propName)
{
foreach (ManagementObject mobj in searcher.Get())
return mobj[propName];
throw new NotSupportedException();
}
我的电脑输出:WORKGROUP
最新评论