連載
» 2015年12月09日 05時00分 公開

WinRT/Metro TIPS:OSのバージョンやデバイスファミリーを識別するには?[Windows 10 UWPアプリ開発]

AnalyticsInfoクラスを使用して、UWPアプリが動作しているデバイスの種類/OSバージョンなどの情報を取得する方法を解説する。

[山本康彦,BluewaterSoft/Microsoft MVP for Windows Development]
WinRT/Metro TIPS
業務アプリInsider/Insider.NET

powered by Insider.NET

「WinRT/Metro TIPS」のインデックス

連載目次

 Windows 10のユニバーサルWindowsプラットフォーム用のアプリ(以降、UWPアプリ)を作るときに、デバイスによって動きを変えたいことがあるだろう。画面を丸ごと切り替えるのであれば、「Xaml view」(「徹底予習! Windows 10のユニバーサルアプリ開発 (4/6)」参照)が使える。しかし、どのデバイスで実行しているかをコード内で知りたいときもあるだろう。また、Windows 10のバージョン情報を知りたいこともあるだろう。本稿では、それらの方法を解説する。なお、本稿のサンプルは「Windows Store app samples:MetroTips #119」からダウンロードできる。

 本稿の内容を試すために必要な開発環境は、本稿の末尾でまとめている(なお、Visual Studio Tools for Universal Windows Appsの最新バージョンは2015年11月30日にリリースされたVisual Studio 2015 Update 1で1.2に上がっている。それらの情報も含めて記載しているので、実際にコードを試してみようという方は参考にしてほしい)。

実行しているデバイスを識別するには?

 UWPアプリ開発で使用するUniversal Windows SDKには、デバイスファミリーを識別するためのAPIが用意されている*1

 具体的には、AnalyticsInfoクラス(Windows.System.Profile名前空間)のVersionInfoプロパティにあるDeviceFamilyプロパティが、デバイスファミリーを表す文字列を持っている。その値は、「Windows.Desktop」(デスクトップPC/ノート/大きいサイズのタブレット)/「Windows.Mobile」(スマートフォン/小さいサイズのタブレット)などとなっている。

*1 デバイスファミリーの概念については、MSDNドキュメント「ユニバーサル Windows プラットフォーム (UWP) アプリのガイド〜デバイス ファミリ」を参照。


実行しているWindows 10のバージョン情報を取得するには?

 同じくAnalyticsInfoクラスのVersionInfoプロパティにあるDeviceFamilyVersionプロパティが、Windows 10のバージョン情報を表す文字列になっている。

 ただし、これで得られる文字列は「2814750438211790」などとなっている。これを64bitの整数として扱い、先頭から16bitずつ取り出すと、見慣れた「10.0.10240.16590」といった形式のバージョン表記に変換できる。

サンプルコードと実行結果

 以上のデバイスファミリーとバージョンを取得するコードは、次のGetVersionInfoメソッドのようになる(取得結果をメンバー変数に保持するようにした)。

private string DeviceFamily { get; set; }
private string OSVersion { get; set; }
private string OSVersionRaw { get; set; }

private void GetVersionInfo()
{
  Windows.System.Profile.AnalyticsVersionInfo versionInfo
    = Windows.System.Profile.AnalyticsInfo.VersionInfo;

  // デバイスファミリーはDeviceFamilyプロパティそのままでよい
  DeviceFamily = versionInfo.DeviceFamily;

  // OSバージョンは、DeviceFamilyVersionプロパティを取得し……
  OSVersionRaw = versionInfo.DeviceFamilyVersion;
  // ulongにして、先頭から16bitずつ取り出すと、
  // 見慣れたバージョン情報になる
  ulong v = ulong.Parse(OSVersionRaw);
  ulong v1 = (v & 0xFFFF000000000000L) >> 48;
  ulong v2 = (v & 0x0000FFFF00000000L) >> 32;
  ulong v3 = (v & 0x00000000FFFF0000L) >> 16;
  ulong v4 = v & 0x000000000000FFFFL;
  OSVersion = $"{v1}.{v2}.{v3}.{v4}"
}

Private Property DeviceFamily As String
Private Property OSVersion As String
Private Property OSVersionRaw As String

Private Sub GetVersionInfo()
  Dim versionInfo As Windows.System.Profile.AnalyticsVersionInfo _
      = Windows.System.Profile.AnalyticsInfo.VersionInfo

  ' デバイスファミリーはDeviceFamilyプロパティそのままでよい
  DeviceFamily = versionInfo.DeviceFamily

  ' OSバージョンは、DeviceFamilyVersionプロパティを取得し……
  OSVersionRaw = versionInfo.DeviceFamilyVersion
  ' ulongにして、先頭から16bitずつ取り出すと、
  ' 見慣れたバージョン情報になる
  Dim v As ULong = ULong.Parse(OSVersionRaw)
  Dim v1 As ULong = (v And &HFFFF000000000000L) >> 48
  Dim v2 As ULong = (v And &H0000FFFF00000000L) >> 32
  Dim v3 As ULong = (v And &H00000000FFFF0000L) >> 16
  Dim v4 As ULong = v And &H000000000000FFFFL
  OSVersion = $"{v1}.{v2}.{v3}.{v4}"
End Sub

デバイスファミリーとバージョンを取得するコード(上:C#/下:VB)
デバイスファミリーには、「Windows.Desktop」/「Windows.Mobile」の他に、「Windows.Team」(Surface Hub用)/「Windows.IoT」/「Windows.Xbox」などがあるようだ(HoloLensについては、筆者はまだ把握していない)。

 上のコードで得られた結果を画面にバインドすると、次の画像のようになる(実際のコードは別途公開のサンプルをご覧いただきたい)。

実行例その1(デスクトップとモバイルエミュレーター) 実行例その1(デスクトップとモバイルエミュレーター)
前述のコードのメンバー変数を画面上のコントロールにバインドした。
デバイスファミリーとWindows 10のバージョン情報が取得できている。

実行例その2(Windows 10 2015年11月版+WindowsアップデートKB3116908) 実行例その2(Windows 10 2015年11月版+WindowsアップデートKB3116908)
デスクトップ用Windows 10のWinVerコマンドで表示されるバージョン表記は、2015年11月版から「バージョン 1511 (OS ビルド 10586.17)」のように変わった(画像左上)。
前述のコードでは「10.0.10586.17」が取得できている(「1511」ではない)。

 なお、コードからデバイスファミリーを識別できるということは、デバイスファミリーによってVisualStateを切り替えるAdaptiveTrigger(「徹底予習! Windows 10のユニバーサルアプリ開発 (4/6)」参照)を作成できるということでもある。そのようなコードも公開されているので、二つ紹介しておこう。

まとめ

 AnalyticsInfoクラスで、Windows 10のバージョン情報とデバイスファミリーを取得できる。また、そのデバイスファミリーに基づくAdaptiveTriggerを利用すれば、画面の一部分をデバイスによって切り替えることも可能になる。

事前準備

 デスクトップ用とモバイル(=Windows 10を搭載したスマートフォン)用のUWPアプリを開発するには、以下の開発環境が必要である。本稿では、無償のVisual Studio Community 2015(およびVisual Studio Tools for Universal Windows Appsバージョン1.1)を使っている。

  • SLAT対応のPC*2
  • 64bit版*3 Windows 10 Pro*4
  • Visual Studio 2015(以降、VS 2015)*5
  • Windows SDK for Windows 10*6、およびVisual Studio Tools for Universal Windows Apps*7

*2 SLAT対応ハードウエアは、モバイルエミュレーターの実行に必要だ。ただし未対応でも、ソースコードのビルドと実機でのデバッグは可能である。SLAT対応のチェック方法はMSDNブログの「Windows Phone SDK 8.0 ダウンロードポイント と Second Level Address Translation (SLAT) 対応PCかどうかを判定する方法」を参照。なお、SLAT対応ハードウエアであっても、VM上ではエミュレーターが動作しないことがあるのでご注意願いたい。

*3 Windows 10 Mobileエミュレーターを使用しないのであれば、32bit版でもよい。

*4 開発に使うWindows 10は「開発者モード」を有効にしておくこと(「設定アプリ」の[更新とセキュリティ]−[開発者向け]で、[開発者モード]ラジオボタンを選択)。そうしないと、VS 2015のXAMLエディターがエラーになる。また、本稿の内容が適用できるのは、Windowsのライフサイクル管理の上では「Windows 10, released in July 2015」と呼ばれるリリース、またはそれ以降。WinVerコマンドで表示されるバージョンは「10.0 (ビルド 10240)」。UWPアプリ開発におけるデバイスファミリーのバージョン指定としては「10.0.0.0」(Package.appxmanifestファイルのTargetDeviceFamily)である。なお、モバイルエミュレーターを使用しないのであれば、Home版でもよい。

*5 本稿に掲載したコードを試すだけなら、無償のExpressエディションやCommunityエディションで構わない。Visual Studio Express 2015 for Windows 10(製品版)はマイクロソフトのページから無償で入手できる(ページの左側で[Visual Studio 2015]−[Express 2015 for Windows 10]と選ぶ)。Expressエディションはターゲットプラットフォームごとに製品が分かれていて紛らわしいが、UWPアプリの開発には「for Windows 10」を使う(「for Desktop」はWPF/Windowsフォーム/Win32 APIのアプリ開発用)。また、Visual Studio Community 2015(製品版)もマイクロソフトのページから無償で入手できる。なお、英語版がインストールされた場合には、Microsoft Visual Studio 2015 Language Packの日本語版を追加インストールし、[オプション]ダイアログで言語を切り替える

*6 使用しているVS 2015に含まれていない場合は、Windows SDK for Windows 10のページからダウンロードできる。本稿の内容が適用できるのは、作成したプロジェクトのプロパティに表示されるターゲットバージョンが「10.0; ビルド 10240」またはそれ以降。ただし、プレビュー版のSDKを使うと、Windowsストアには提出できなくなるので注意してほしい。

*7 Visual Studio Tools for Universal Windows Appsは、2015年9月16日付でバージョン1.1に上がっている。それ以前に開発環境を整えた人は、個別にアップデートする必要がある。「Update 1.1: Release Notes and Installation Instructions」(英語)を参照。なお、2015年11月30日付でリリースされたVisual Studio 2015 Update 1を使っている場合は、Visual Studio Tools for Universal Windows Appsをインストールするだけでよい(バージョン1.2が入る)。



「WinRT/Metro TIPS」のインデックス

WinRT/Metro TIPS

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。