UWPアプリ開発]DirectXが提供するAPIを利用して、UWPアプリからデスクトップ画面全体のサイズを取得する方法を解説する。10のユニバーサルWindowsプラットフォーム用のアプリ(以降、UWPアプリ)は、PCやノートブックではデスクトップ上の独立したウィンドウとして動作する。なると、画面のサイズ(=画面全体の縦/横のピクセル数)を知りたくなることがあるだろう。画面に対して一定の割合のサイズでウィンドウを表示したいというような場合が考えられる*1。ところが、WindowsランタイムにはそのようなAPIが用意されていないのだ(本稿執筆時点)。何とかならないだろうか?画面サイズの取得は、DirectXを使えば可能である。本稿ではその方法を解説する。#120」からダウンロードできる。1で1.2に上がっている。それらの情報も含めて記載しているので、実際にコードを試してみようという方は参考にしてほしい)。UWPアプリ開発]」を参照。画面の物理サイズを取得するには?DirectXのIDXGIOutputインターフェースを利用する*2。DirectXのコーディングはC++で行うことになる*3。Shamam氏がサンプルコードをフリーで公開してくれているので、それを使わせていただこう。APIを使うときは、それが利用できることを必ず確認してほしい。確認を怠っていると、Windowsストアの審査で引っ掛かり、根本から作り直すはめにもなりかねない。(graphics)」を参照。アプリ認定キット(WACK)でチェックすることをお勧めする。DirectXをラップしたライブラリ(SharpDXなど)を使ってC#/VBでコーディングする方法もある。TIPS:SharpDXを使ってDirectXで音声ファイルを再生するには?[ユニバーサルWindowsアプリ開発]」。DllImportを使ってC#/VBのコードから直接APIを利用する方法も考えられるが、単純なAPI呼び出し一つだけだというのならともかく、今回のようなコードではC++で書いてしまった方が楽だろう。次に挙げるShamam氏のブログ記事の文中に「MetroScreenRes.zip」ファイルへのリンクがあるので、それをダウンロードしていただきたい(別途公開のサンプルには、以降の手順でUWPアプリ対応にしたプロジェクトを含めてある)。8用のものなので、そのままではUWPアプリから利用できない。コンポーネントに移植する」を参照)。C#/VB用のUWPアプリのプロジェクトとソリューションを用意するC++用のWindowsランタイムコンポーネントのプロジェクトを、「MetroHelpers」という名前でソリューションに追加する(下の画像)。ビルドしてはいけない。ソリューションを閉じ、Windowsのエクスプローラーを使って、「MetroHelpers」プロジェクトから全ての*.h/*.cppファイルを削除するエクスプローラーを使って、「MetroScreenRes.zip」ファイル中のMetroHelpersフォルダーから全ての*.h/*.cppファイルを「MetroHelpers」プロジェクトのフォルダーにコピーするソリューションを開き、上でコピーしたファイルを「MetroHelpers」プロジェクトに追加する「MetroHelpers」プロジェクトをビルドするC#/VBプロジェクトの参照に、「MetroHelpers」プロジェクトを追加する以上で、C#/VBプロジェクトの中から「MetroAssist」クラス(「MetroHelpers」名前空間)が利用できるようになる。C++用のWindowsランタイムコンポーネントのプロジェクトを追加するソリューションに新しいプロジェクトを追加するときのダイアログである。Windows)]を選択し、プロジェクト名には「MetroHelpers」と付け、プロジェクトを作成する。プロジェクト名がそのまま名前空間の名前になるので、注意してほしい(異なるプロジェクト名にすると、コードの修正が必要になる)。この「MetroAssist」クラスを使えば、次のようにしてC#/VBのコードから画面の物理サイズを取得できる。Sub画面の物理サイズを取得するコード(上:C#/下:VB)このコードは、MainPage.xaml.cs/.vbファイルに追加する。この他、画面が表示されたときなどに、この「GetScreenInfo」メソッドを呼び出すコードが必要である。上述の方法で取得した画面サイズは物理ピクセルなので、プログラム中で扱うには実効ピクセルに換算する必要がある。物理ピクセルと実効ピクセルの比率がDisplayInformationクラス(Windows.Graphics.Display名前空間)のRawPixelsPerViewPixelプロパティで得られるので、次のコードのようにして実効ピクセルを求める。Sub画面の実効サイズを取得するコード(上:C#/下:VB)太字の部分を追加した。以上のコードを組み込んで、別途公開のサンプルを作成した。このサンプルには、さらに画面の向き(DisplayInformationクラスのCurrentOrientationプロパティ)と、アプリ自身のウィンドウサイズを表示するようにしてある*4。TIPS:画面のサイズを取得するには?[ユニバーサルWindowsアプリ開発]」の「論理サイズを取得するには?」の項を参照。8.1ではDIP(デバイス非依存ピクセル)単位であったが、UWPアプリでは実効ピクセル単位になっている。PCのシミュレーターで動作させると次の画像のようになる。物理ピクセルで1920×1080ピクセルの画面である。上から順に、以下のようになっている。横置き、全画面モード画面の向きや表示モードによらず、画面のサイズが物理ピクセル(「px」)と実効ピクセル(「epx」)で正しく取得できている(実効ピクセルは小数点以下1桁で四捨五入している)。最後の全画面モードでは、ウィンドウのサイズが画面のサイズと一致している。「最大化表示」と「全画面モード」は異なるものである。UWPアプリ開発]」を参照してほしい。Mobileのエミュレーターで実行した場合だ。モバイルでは、DirectXで取得できる画面のサイズが画面の向きによらず常に同じになることに注意してほしい。物理ピクセルで480×800ピクセルの画面である。画面の向きによらず、どちらも幅480ピクセル/高さ800ピクセルとレポートされていることに注意。PCとモバイルに対応したUWPアプリの場合は、デバイスによって幅と高さの値を入れ替えるロジックが必要になる。UWPアプリ開発]」を参照。モバイルでは常に全画面モードなので、アプリ自身のウィンドウサイズは画面サイズに等しい。モバイルだけならDirectXを使わずに済むのである。まとめDirectXを使えば、画面のサイズを取得できる。それにはC++で作成したWindowsランタイムコンポーネントが必要になるが、別途公開のサンプルを活用していただければ幸いである。画面の向きを回転させたときに得られる値がPCとモバイルでは異なるので、ご注意願いたい。10を搭載したスマートフォン)用のUWPアプリを開発するには、以下の開発環境が必要である。Appsバージョン1.2)を使っている。SLAT対応ハードウエアは、モバイルエミュレーターの実行に必要だ。未対応でも、ソースコードのビルドと実機でのデバッグは可能である。対応PCかどうかを判定する方法」を参照。SLAT対応ハードウエアであっても、VM上ではエミュレーターが動作しないことがあるのでご注意願いたい。Mobileエミュレーターを使用しないのであれば、32bit版でもよい。10は「開発者モード」を有効にしておくこと(「設定アプリ」の[更新とセキュリティ]−[開発者向け]で、[開発者モード]ラジオボタンを選択)。2015のXAMLエディターがエラーになる。2015」と呼ばれるリリース、またはそれ以降。UWPアプリ開発におけるデバイスファミリーのバージョン指定としては「10.0.0.0」(Package.appxmanifestファイルのTargetDeviceFamily)である。モバイルエミュレーターを使用しないのであれば、Home版でもよい。本稿に掲載したコードを試すだけなら、無償のExpressエディションやCommunityエディションで構わない。APIのアプリ開発用)。2015(製品版)もマイクロソフトのページから無償で入手できる。Packの日本語版を追加インストールし、[オプション]ダイアログで言語を切り替える。10のページからダウンロードできる。10240」またはそれ以降。プレビュー版のSDKを使うと、Windowsストアには提出できなくなるので注意してほしい。Appsは、2015年9月16日付でバージョン1.1に上がっている。それ以前に開発環境を整えた人は、個別にアップデートする必要がある。Instructions」(英語)を参照。Appsをインストールするだけでよい(バージョン1.2が入る)。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。