2011年8月26日金曜日

wpf : ディスプレイの解像度を調べる

wpfのライブラリをちょっと調べたところ、ディスプレイの解像度を調べる方法はみつかりませんでした。 通常の、.NET Frameworkのwpfじゃない部分を使って解像度を調べます。 MainWindowがあるディスプレイの解像度を調べるには、

WindowInteropHelper wih = new WindowInteropHelper(App.Current.MainWindow);
System.Windows.Forms.Screen screen = System.Windows.Forms.Screen.FromHandle(wih.Handle);
System.Drawing.Rectangle bounds = screen.Bounds;

System.Windows.FormsとSystem.Drawingの参照が必要です。 ここで使っているRectangleはwpfのシェイプではないので注意。 名前が衝突しないようにusingを使用せずに↑のように名前空間ごと全部書くか、

using DNETDrawing = System.Drawing;
...
DNETDrawing.Rectangle bounds = screen.Bounds;

などのように書きましょう。

int width = screen.Bounds.Width;

というふうにRectangleの変数を作らず直接代入するのもいいかもしれません。

MainWindowクラス内に書くときはApp.Current.MainWindowの代わりにthisでかまいません。 MainWindowがあるディスプレイ以外について調べる場合は、System.Windows.Forms.ScreenクラスのPrimaryScreenプロパティやAllScreensプロパティを使います。 どちらもstaticプロパティで、それらを使う場合はWindowInteropHelperは要りません。 PrimaryScreenは名前の通りプライマリディスプレイの情報で、AllScreensはシステム上のすべてのディスプレイについての情報が格納されているScreen型の配列になります。 (いや、シングルディスプレイの環境で試したんでこの辺確かめてないんですけどね...)

この調べ方で得られる解像度はデバイスピクセル単位であり、wpfの論理ピクセル単位ではありません。 デバイスピクセル単位 ⇔ 論理ピクセル単位の変換については前の投稿を見てください。