重新想象 Windows 8 Store Apps (30) - 信息: 获取包信息, 系统信息, 硬件信息, PnP信息, 常用设备信息

简介: 原文:重新想象 Windows 8 Store Apps (30) - 信息: 获取包信息, 系统信息, 硬件信息, PnP信息, 常用设备信息[源码下载] 重新想象 Windows 8 Store Apps (30) - 信息: 获取包信息, 系统信息, 硬件信息, PnP信息, 常用设备信息...
原文: 重新想象 Windows 8 Store Apps (30) - 信息: 获取包信息, 系统信息, 硬件信息, PnP信息, 常用设备信息

[源码下载]


重新想象 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<string> 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<PnpObject> 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

<Page
    x:Class="XamlDemo.Information.PnpObjectInfo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:XamlDemo.Information"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="Transparent">
        <Grid Margin="120 0 0 0">

            <ListBox x:Name="listBox" Margin="0 0 10 10">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock FontWeight="Bold" Text="{Binding Name}" />
                            <TextBlock Text="{Binding Id}" />
                            <TextBlock Text="{Binding Properties}" />
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
            
        </Grid>
    </Grid>
</Page>

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));
            }
        }

        /// <summary>
        /// 用于保存 PnP 设备的相关信息
        /// </summary>
        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

<Page
    x:Class="XamlDemo.Information.DeviceInfo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:XamlDemo.Information"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="Transparent">
        <Grid Margin="120 0 0 0">

            <ListBox x:Name="listBox" Margin="0 0 10 10">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Margin="0 0 0 20">
                            <TextBlock FontWeight="Bold" Text="{Binding Path=Name}" />
                            <TextBlock Text="{Binding Path=Id}" />
                            <TextBlock Text="{Binding Path=IsEnabled}" />
                            <StackPanel Orientation="Horizontal">
                                <TextBlock VerticalAlignment="Center" Text="设备缩略图:" />
                                <Image Width="256" Height="256" Source="{Binding Path=Thumbnail}" Margin="10 0 0 0" />
                            </StackPanel>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock VerticalAlignment="Center" Text="设备图标:" />
                                <StackPanel Background="Blue" Margin="10 0 0 0">
                                    <Image Width="48" Height="48" Source="{Binding Path=GlyphThumbnail}" />
                                </StackPanel>
                            </StackPanel>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

        </Grid>
    </Grid>
</Page>

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 类型的枚举)
        }


        /// <summary>
        /// 用于保存常用设备的相关信息
        /// </summary>
        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
[源码下载]

目录
相关文章
|
5月前
|
JSON API 开发工具
【Azure 应用服务】调用Azure REST API来获取 App Service的访问限制信息(Access Restrictions)以及修改
【Azure 应用服务】调用Azure REST API来获取 App Service的访问限制信息(Access Restrictions)以及修改
|
5月前
|
Linux C++ Windows
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
|
2月前
|
安全 Windows
【Azure Cloud Service】在Windows系统中抓取网络包 ( 不需要另外安全抓包工具)
通常,在生产环境中,为了保证系统环境的安全和纯粹,是不建议安装其它软件或排查工具(如果可以安装,也是需要走审批流程)。 本文将介绍一种,不用安装Wireshark / tcpdump 等工具,使用Windows系统自带的 netsh trace 命令来获取网络包的步骤
84 32
|
2月前
|
C# Windows
【Azure App Service】在App Service for Windows上验证能占用的内存最大值
根据以上测验,当使用App Service内存没有达到预期的值,且应用异常日志出现OutOfMemory时,就需要检查Platform的设置是否位64bit。
52 11
|
3月前
|
C# 开发工具 Windows
C# 获取Windows系统信息以及CPU、内存和磁盘使用情况
C# 获取Windows系统信息以及CPU、内存和磁盘使用情况
93 0
|
4月前
|
安全 网络安全 API
基于WMI更新Windows系统信息采集程序sysInfo的一些收获
基于WMI更新Windows系统信息采集程序sysInfo的一些收获
|
5月前
|
Java 应用服务中间件 开发工具
[App Service for Windows]通过 KUDU 查看 Tomcat 配置信息
[App Service for Windows]通过 KUDU 查看 Tomcat 配置信息
|
5月前
|
Java 应用服务中间件 Windows
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
|
5月前
|
PHP Windows
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
|
5月前
|
PHP 开发工具 git
【Azure 应用服务】在 App Service for Windows 中自定义 PHP 版本的方法
【Azure 应用服务】在 App Service for Windows 中自定义 PHP 版本的方法