| 
 | 
	
 
 
  [源码下载] 
 
 
 
 
重新想象 Windows 8 Store Apps (30) - 信息: 获取包信息, 系统信息, 硬件信息, PnP信息, 常用设备信息   
作者:webabcd 
 
介绍 
重新想象 Windows 8 Store Apps 之 信息 
 
 
- 获取包信息
 
 - 获取系统信息
 
 - 获取硬件信息
 
 - 获取即插即用(PnP: Plug and Play)的设备的信息
 
 - 获取常用设备信息
 
     
示例 
1、演示如何获取 app 的 package 信息 
Information/PackageInfo.xaml.cs 
 
 
 
/* 
* 演示如何获取 app 的 package 信息 
*/ 
using System; 
using Windows.ApplicationModel; 
using Windows.UI.Xaml.Controls; 
using Windows.UI.Xaml.Navigation; 
namespace XamlDemo.Information 
{ 
public sealed partial class PackageInfo : Page 
{ 
public PackageInfo() 
{ 
this.InitializeComponent(); 
} 
protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
Package package = Package.Current; 
PackageId packageId = package.Id; 
lblMsg.Text = "Name: " + packageId.Name; // 包名 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "Version: " + packageId.Version; // 版本信息 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "Architecture: " + packageId.Architecture; // 支持的 cpu 类型(X86, Arm, X64, Neutral(均支持), Unknown) 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "Publisher: " + packageId.Publisher; // 发布者 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "PublisherId: " + packageId.PublisherId; // 发布者 id 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "FullName: " + packageId.FullName; // 包全名(Name + Version + Architecture + PublisherId) 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "FamilyName: " + packageId.FamilyName; // 包系列名(Name + PublisherId) 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "Installed Location Path: " + package.InstalledLocation.Path; // 包的安装路径 
        } 
} 
} 
   
2、演示如何获取系统的相关信息 
Information/SystemInfo.xaml.cs 
 
 
 
/* 
* 演示如何获取系统的相关信息 
*/ 
using System; 
using System.Globalization; 
using System.Threading.Tasks; 
using Windows.Devices.Enumeration.Pnp; 
using Windows.UI.Xaml.Controls; 
using Windows.UI.Xaml.Navigation; 
using System.Linq; 
namespace XamlDemo.Information 
{ 
public sealed partial class SystemInfo : Page 
{ 
public SystemInfo() 
{ 
this.InitializeComponent(); 
} 
protected async override void OnNavigatedTo(NavigationEventArgs e) 
{ 
lblMsg.Text += "CPU 核心数量:" + Environment.ProcessorCount.ToString(); 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "系统自上次启动以来所经过的毫秒数:" + Environment.TickCount; 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "当前语言:" + CultureInfo.CurrentCulture.DisplayName; 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "当前时间:" + DateTime.Now.ToString("yyyy年MM月dd日 HH:mm:ss") + " 星期" + "日一二三四五六七".Substring((int)DateTime.Now.DayOfWeek, 1); 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "当前时区:" + "UTC" + DateTimeOffset.Now.ToString("%K"); 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "当前系统版本号:" + (await GetWindowsVersionAsync()).ToString(); 
} 
#region 获取当前系统版本号,摘自:http://attackpattern.com/2013/03/device-information-in-windows-8-store-apps/ 
public static async Task GetWindowsVersionAsync() 
{ 
var hal = await GetHalDevice(DeviceDriverVersionKey); 
if (hal == null || !hal.Properties.ContainsKey(DeviceDriverVersionKey)) 
return null; 
var versionParts = hal.Properties[DeviceDriverVersionKey].ToString().Split('.'); 
return string.Join(".", versionParts.Take(2).ToArray()); 
} 
private static async Task GetHalDevice(params string[] properties) 
{ 
var actualProperties = properties.Concat(new[] { DeviceClassKey }); 
var rootDevices = await PnpObject.FindAllAsync(PnpObjectType.Device, 
actualProperties, RootQuery); 
foreach (var rootDevice in rootDevices.Where(d => d.Properties != null && d.Properties.Any())) 
{ 
var lastProperty = rootDevice.Properties.Last(); 
if (lastProperty.Value != null) 
if (lastProperty.Value.ToString().Equals(HalDeviceClass)) 
return rootDevice; 
} 
return null; 
} 
const string DeviceClassKey = "{A45C254E-DF1C-4EFD-8020-67D146A850E0},10"; 
const string DeviceDriverVersionKey = "{A8B865DD-2E3D-4094-AD97-E593A70C75D6},3"; 
const string RootContainer = "{00000000-0000-0000-FFFF-FFFFFFFFFFFF}"; 
const string RootQuery = "System.Devices.ContainerId:=\"" + RootContainer + "\""; 
const string HalDeviceClass = "4d36e966-e325-11ce-bfc1-08002be10318"; 
#endregion 
} 
} 
   
3、演示如何获取硬件相关的信息 
Information/HardwareInfo.xaml.cs 
 
 
 
/* 
* 演示如何获取硬件相关的信息 
*/ 
using System; 
using Windows.Security.ExchangeActiveSyncProvisioning; 
using Windows.Storage.Streams; 
using Windows.System.Profile; 
using Windows.UI.Xaml.Controls; 
using Windows.UI.Xaml.Navigation; 
namespace XamlDemo.Information 
{ 
public sealed partial class HardwareInfo : Page 
{ 
public HardwareInfo() 
{ 
this.InitializeComponent(); 
} 
protected override void OnNavigatedTo(NavigationEventArgs e) 
{ 
HardwareToken hardwareToken = HardwareIdentification.GetPackageSpecificToken(null); 
lblMsg.Text = "Id: " + Buffer2Base64(hardwareToken.Id); // 硬件 ID 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "Signature: " + Buffer2Base64(hardwareToken.Signature); // 硬件签名 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "Certificate: " + Buffer2Base64(hardwareToken.Certificate); // 硬件证书 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += Environment.NewLine; 
 
EasClientDeviceInformation easClientDeviceInformation = new EasClientDeviceInformation(); 
lblMsg.Text += "Id: " + easClientDeviceInformation.Id; // 设备 ID 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "FriendlyName: " + easClientDeviceInformation.FriendlyName; // 计算机名 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "OperatingSystem: " + easClientDeviceInformation.OperatingSystem; // 操作系统 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "SystemManufacturer: " + easClientDeviceInformation.SystemManufacturer; // 设备的制造商 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += Environment.NewLine; 
lblMsg.Text += "SystemProductName: " + easClientDeviceInformation.SystemProductName; // 设备的产品名 
        } 
private string Buffer2Base64(IBuffer buffer) 
{ 
using (var dataReader = DataReader.FromBuffer(buffer)) 
{ 
try 
{ 
var bytes = new byte[buffer.Length]; 
dataReader.ReadBytes(bytes); 
return Convert.ToBase64String(bytes); 
} 
catch (Exception ex) 
{ 
return ex.ToString(); 
} 
} 
} 
} 
} 
   
4、演示如何获取即插即用(PnP: Plug and Play)的设备的相关信息 
Information/PnpObjectInfo.xaml 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  Information/PnpObjectInfo.xaml.cs 
 
 
 
/* 
* 演示如何获取即插即用(PnP: Plug and Play)的设备的相关信息 
*/ 
using System; 
using Windows.Devices.Enumeration.Pnp; 
using Windows.UI.Xaml.Controls; 
using Windows.UI.Xaml.Navigation; 
namespace XamlDemo.Information 
{ 
public sealed partial class PnpObjectInfo : Page 
{ 
public PnpObjectInfo() 
{ 
this.InitializeComponent(); 
} 
protected async override void OnNavigatedTo(NavigationEventArgs e) 
{ 
listBox.Items.Clear(); 
string[] properties = { "System.ItemNameDisplay", "System.Devices.Manufacturer", "System.Devices.ModelName", "System.Devices.Connected" }; 
// 通过 PnpObject.FindAllAsync() 获取所有 PnP 设备的指定的信息(更多的属性名称请参见:http://technet.microsoft.com/zh-cn/library/hh464997.aspx) 
var containers = await PnpObject.FindAllAsync(PnpObjectType.DeviceContainer, properties); 
// 显示获取到的 PnP 设备的相关信息 
foreach (PnpObject container in containers) 
{ 
listBox.Items.Add(new DisplayItem(container)); 
} 
} 
///  
/// 用于保存 PnP 设备的相关信息 
///  
class DisplayItem 
{ 
public string Id { get; private set; } 
public string Name { get; private set; } 
public string Properties { get; private set; } 
public DisplayItem(PnpObject container) 
{ 
// 该 PnpObject 的名称 
Name = (string)container.Properties["System.ItemNameDisplay"]; 
if (string.IsNullOrWhiteSpace(Name)) 
Name = "未知"; 
// 该 PnpObject 的标识 
Id = "Id: " + container.Id; 
// 该 PnpObject 的信息 
foreach (var property in container.Properties) 
{ 
Properties += property.Key + " = " + property.Value + "\n"; 
} 
} 
} 
} 
} 
   
5、演示如何获取常用设备的相关信息 
Information/DeviceInfo.xaml 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  Information/DeviceInfo.xaml.cs 
 
 
 
/* 
* 演示如何获取常用设备的相关信息 
*/ 
using System; 
using Windows.Devices.Enumeration; 
using Windows.UI.Xaml.Controls; 
using Windows.UI.Xaml.Media.Imaging; 
using Windows.UI.Xaml.Navigation; 
namespace XamlDemo.Information 
{ 
public sealed partial class DeviceInfo : Page 
{ 
public DeviceInfo() 
{ 
this.InitializeComponent(); 
} 
protected async override void OnNavigatedTo(NavigationEventArgs e) 
{ 
listBox.Items.Clear(); 
// {0ECEF634-6EF0-472A-8085-5AD023ECBCCD} - 打印设备 
// {E5323777-F976-4F5B-9B55-B94699C46E44} - 摄像设备 
// {6AC27878-A6FA-4155-BA85-F98F491D4F33} - 便携设备 
// 通过 DeviceInformation.FindAllAsync() - 获取指定类型的设备信息 
var interfaces = await DeviceInformation.FindAllAsync("System.Devices.InterfaceClassGuid:=\"{6AC27878-A6FA-4155-BA85-F98F491D4F33}\"", null); // 获取全部便携设备的设备信息 
// var interfaces = await DeviceInformation.FindAllAsync(DeviceClass.AudioRender); // 通过 DeviceClass 枚举获取指定类型的设备信息 
// 显示获取到的常用设备的相关信息 
foreach (DeviceInformation deviceInterface in interfaces) 
{ 
DeviceThumbnail thumbnail = await deviceInterface.GetThumbnailAsync(); 
DeviceThumbnail glyph = await deviceInterface.GetGlyphThumbnailAsync(); 
listBox.Items.Add(new DisplayItem(deviceInterface, thumbnail, glyph)); 
} 
// 创建一个 DeviceWatcher 对象以便在设备发生变化时收到通知 
DeviceWatcher deviceWatcher = DeviceInformation.CreateWatcher(); 
// DeviceWatcher 的相关事件有:Added, EnumerationCompleted, Removed, Stopped, Updated 
// DeviceWatcher 的相关方法有:Start(), Stop() 
// DeviceWatcher 的相属性件有:Status(一个 DeviceWatcherStatus 类型的枚举) 
        } 
 
///  
/// 用于保存常用设备的相关信息 
///  
class DisplayItem 
{ 
public string Name { get; private set; } 
public string Id { get; private set; } 
public string IsEnabled { get; private set; } 
public BitmapImage Thumbnail { get; private set; } 
public BitmapImage GlyphThumbnail { get; private set; } 
public DisplayItem(DeviceInformation deviceInterface, DeviceThumbnail thumbnail, DeviceThumbnail glyph) 
{ 
// 设备名称 
Name = (string)deviceInterface.Properties["System.ItemNameDisplay"]; 
// 设备标识 
Id = "ID: " + deviceInterface.Id; 
// 设备是否已启用 
IsEnabled = "IsEnabled: " + deviceInterface.IsEnabled; 
// 设备缩略图 
Thumbnail = new BitmapImage(); 
Thumbnail.SetSource(thumbnail); 
// 设备图标 
GlyphThumbnail = new BitmapImage(); 
GlyphThumbnail.SetSource(glyph); 
} 
} 
} 
} 
   
OK 
[源码下载] |   
 
 
 
 | 
  
 |