NONCLIENTMETRICS 構造体の iPaddedBorderWidth 値を正しく取得する方法

現象
SystemParametersInfo 関数を使用して SPI_GETNONCLIENTMETRICS の値を取得する場合、構造体のサイズおよび実行ファイルのサブシステム指定によって取得できる値が異なります。Windows 7 の環境にてすべての値を取得するには、Windows 7 用に開発されたアプリケーションであることを示す必要があります。

原因
本現象には、iBorderWidth の値から iPaddedBorderWidth を分離して個別に設定できるようにしたこと、および従来のアプリケーションに対する互換機能が新たに提供されたことが影響しています。
解決方法
Windows 7 において、すべての値を取得するには、以下の手順が必要です。 

  1. SystemParametersInfo 関数の引数に指定する NONCLIENTMETRICS 構造体は、OS のバージョンに依存するメンバーが含まれています。Windows 7 用の値を取得するには、WINVER に 0x0600 以上を指定し、メンバー cbSize には追加されたメンバーの分を含むサイズを指定してください。
  2. 実行ファイルを生成するリンク時に、LINK.EXE のオプションにてサブシステム バージョン 6.0 以上を指定してください。(例: /SUBSYSTEM:Windows,6.0)

上記 2 つの手順を実施することにより、NONCLIENTMETRICS 構造体の iPaddedBorderWidth 値が iBorderWidth 値から分離されて取得できるようになります。この指定がない場合には、iBorderWidth に iPaddedBorderWidth 値が加算された値が取得できます。

なお、関数内部の処理にて NONCLIENTMETRICS 構造体の値を参照する GetSystemMetrics 関数の返り値も、この指定の影響を受けて変化します。GetSystemMetrics 関数を使用して以下の値を取得する際には、期待する値が取得できているか、注意が必要となります。
  • SM_CXFRAME
  • SM_CYFRAME
  • SM_CXPADDEDBORDER
状況
この動作は仕様です。
詳細
Visual Studio 2010 リンカー オプション - /SUBSYSTEM (サブシステムの指定)
http://msdn.microsoft.com/ja-jp/library/fcc1zstk.aspx

NONCLIENTMETRICS Structure
http://msdn.microsoft.com/en-us/library/ff729175.aspx

iPaddedBorderWidth は、ウィンドウ枠の幅のうち、最外部にある 3D エッジなどを除いた部分 (パディング部分) を指します。Aero テーマにおけるデフォルト値は 4 ピクセルです。
注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。
プロパティ

文書番号:2584604 - 最終更新日: 09/20/2016 09:38:00 - リビジョン: 2.0

Windows Software Development Kit for Windows 7 and Microsoft .NET Framework 3.5 Service Pack 1: Rele

  • kbhowto kbexpertiseinter KB2584604
フィードバック