重新想象 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
[源码下载]

目录
相关文章
|
4月前
|
JSON API 开发工具
【Azure 应用服务】调用Azure REST API来获取 App Service的访问限制信息(Access Restrictions)以及修改
【Azure 应用服务】调用Azure REST API来获取 App Service的访问限制信息(Access Restrictions)以及修改
|
4月前
|
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函数
|
24天前
|
C# Windows
【Azure App Service】在App Service for Windows上验证能占用的内存最大值
根据以上测验,当使用App Service内存没有达到预期的值,且应用异常日志出现OutOfMemory时,就需要检查Platform的设置是否位64bit。
41 11
|
4月前
|
Java 应用服务中间件 开发工具
[App Service for Windows]通过 KUDU 查看 Tomcat 配置信息
[App Service for Windows]通过 KUDU 查看 Tomcat 配置信息
|
4月前
|
Java 应用服务中间件 Windows
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
|
4月前
|
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. 错误
|
4月前
|
PHP 开发工具 git
【Azure 应用服务】在 App Service for Windows 中自定义 PHP 版本的方法
【Azure 应用服务】在 App Service for Windows 中自定义 PHP 版本的方法
|
4月前
|
网络安全 API 数据安全/隐私保护
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
|
4月前
|
Shell PHP Windows
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
|
4月前
|
存储 Linux Windows
【应用服务 App Service】App Service For Windows 如何挂载Storage Account File Share 示例
【应用服务 App Service】App Service For Windows 如何挂载Storage Account File Share 示例