web-dev-qa-db-ja.com

現在の画面解像度をどのように検出しますか?

Winapi(CまたはC++)から現在の画面解像度を検出するにはどうすればよいですか?

背景:

新しいOpenGLフルスクリーンウィンドウを起動したいが、デスクトップが既に設定されているのと同じ水平および垂直サイズで開きたい。 (今では誰もがLCDスクリーンを使用しているとき、これがスクリーンのネイティブ解像度を得るための最良の方法であると考えました。)

デスクトップの色深度も必死に知る必要はありませんが、それはナイスボーナスになります。

36
Prof. Falken
  • プライマリモニターのサイズ: GetSystemMetrics SM_CXSCREEN/SM_CYSCREEN(GetDeviceCapsも使用できます)
  • すべてのモニターのサイズ(結合):GetSystemMetrics SM_CX/YVIRTUALSCREEN
  • プライマリモニターの作業領域(タスクバーとその他のドッキングバーを除く画面)のサイズ: SystemParametersInfo SPI_GETWORKAREA
  • 特定のモニターのサイズ(作業領域と「画面」): GetMonitorInfo

編集:モニターは常に0x0で「開始」するわけではないので、サイズを知っているだけではウィンドウを配置するには不十分であることに注意してください。 MonitorFromWindowを使用して、ウィンドウが表示されているモニターを検索し、GetMonitorInfoを呼び出すことができます。

低レベルのルートに移動したり、解像度を変更する場合は、EnumDisplayDevices、EnumDisplaySettings、ChangeDisplaySettingsを使用する必要があります(これは、リフレッシュレートを知る唯一の方法ですが、GetDeviceCapsは色深度を示します)

68
Anders

システムがGetSystemMetricsまたはGetWindowRectを使用して DPI仮想化 (Vista以降)を使用すると、実際の画面解像度を取得するためにfailDPI Aware Application を作成していない限り、仮想解像度を取得します。

したがって、ここでの最適なオプション(シンプルおよび下位互換性)は、ENUM_CURRENT_SETTINGSでEnumDisplaySettingsを使用することです。

6
fingeros

これらは GetSystemMetrics です:
SM_CXSCREEN <幅
SM_CYSCREEN <高さ

それが言うように(SM_CXSCREEN):

プライマリディスプレイモニターの画面の幅(ピクセル単位)。これは、GetDeviceCaps(hdcPrimaryMonitor、HORZRES)のようにGetDeviceCapsを呼び出して取得した値と同じです。

5
Poni

SystemParametersInfo が役立つと思います。

編集: GetMonitorInfo も見てください。

3
Mehrdad

MFCの例GetSystemMetrics EnumDisplayMonitorsおよびGetMonitorInfoによる複数モニターのサポート

このリンクに従ってください: ソースコードで列挙を監視

3
Ulterior

約1週間前に削除し、3-4-13を編集しました。

これは、ユーザーがデスクトップを低解像度で実行することを決定した場合(悪い考え)や、グラフィックコントローラーが十分に活用できないモニターを手に入れることを決定した場合に適しています。

// get actual size of desktop
RECT actualDesktop;
GetWindowRect(GetDesktopWindow(), &actualDesktop);
2
formerBGIuser

GetSystemMetrics関数を使用します

GetSystemMetrics(SM_CXSCREEN)は、画面の幅(ピクセル単位)を返します

GetSystemMetrics(SM_CYSCREEN)-ピクセル単位の高さ

https://msdn.Microsoft.com/en-us/library/windows/desktop/ms724385%28v=vs.85%29.aspx

0
Petr