次の方法で共有


アクティブなアクセシビリティと Windows Vista 画面のスケーリング

Windows Vista を使用すると、ユーザーはドット/インチ (dpi) 設定を変更して、画面上のほとんどの UI 要素が大きく表示されるようにすることができます。 この機能は長い間 Microsoft Windows で使用できますが、以前のバージョンでは、スケーリングをアプリケーションで実装する必要がありました。 Windows Vista では、デスクトップ ウィンドウ マネージャーは、独自のスケーリングを処理しないすべてのアプリケーションに対して既定のスケーリングを実行します。 Microsoft Active Accessibility クライアント アプリケーションでは、この機能を考慮する必要があります。

Windows Vista でのスケーリング

既定の dpi 設定は 96 です。これは、96 ピクセルが 1 つの概念インチの幅または高さを占めることを意味します。 "インチ" の正確な測定値は、モニターのサイズと物理的な解像度によって異なります。 たとえば、12 インチ幅のモニターでは、水平解像度が 1280 ピクセルの場合、96 ピクセルの水平線は約 9/10 インチに拡張されます。

dpi 設定の変更は、画面の解像度を変更するのと同じではありません。 dpi スケーリングでは、画面上の物理ピクセルの数は変わりません。 ただし、スケーリングは UI 要素のサイズと場所に適用されます。 このスケーリングは、デスクトップ ウィンドウ マネージャー (DWM) によって、デスクトップと、スケーリングしないことを明示的に要求しないアプリケーションに対して自動的に実行できます。

実際には、ユーザーがスケール ファクターを 120 dpi に設定すると、画面上の垂直方向または水平方向のインチが 25% 大きくなります。 すべてのディメンションは、それに応じてスケーリングされます。 画面の上端と左端からのウィンドウのオフセットが 25% 増加します。 ウィンドウのサイズは、含まれるすべての UI 要素のオフセットとサイズと共に、同じ比率で増加します。

既定では、ユーザーが dpi を 120 に設定した場合、DWM は dpi 対応でないアプリケーションのスケーリングを実行しませんが、dpi が 144 以上のカスタム値に設定されている場合は実行されます。 ただし、ユーザーは既定の動作をオーバーライドできます。

画面のスケーリングは、画面座標に関係するアプリケーションに新しい課題を生み出します。 画面に物理座標系と論理座標系の 2 つの座標系が含まれるようになりました。 ポイントの物理的な座標は、原点の左上からの実際のオフセット (ピクセル単位) です。 論理座標は、ピクセル自体がスケーリングされた場合と同様のオフセットです。

たとえば、座標 (100、48) にボタンがあるダイアログ ボックスをデザインするとします。 このダイアログ ボックスが既定の 96 dpi で表示されている場合、ボタンは物理座標 (100、48) にあります。 120 dpi では、物理座標 (125、60) に配置されます。 ただし、論理座標は任意の dpi 設定 (100、48) で同じです。

論理座標は、dpi 設定に関係なく、オペレーティング システムとアプリケーションの動作を一貫性のあるものにするため、重要です。 たとえば、 System.Windows.Forms.Cursor.Position は通常、論理座標を返します。 ダイアログ ボックス内の要素の上にカーソルを移動すると、dpi の設定に関係なく、同じ座標が返されます。 コントロールを (100, 100) で描画すると、そのコントロールはそれらの論理座標に描画され、任意の dpi 設定で同じ相対位置を占めます。

アクティブなアクセシビリティ クライアントでのスケーリング

Microsoft Active Accessibility では、論理座標は使用されません。 次のメソッドと関数は、物理座標を返すか、パラメーターとして受け取ります。

既定では、96 dpi 以外の環境で実行されている Microsoft Active Accessibility クライアント アプリケーションは、これらの呼び出しから正しい結果を取得できません。 たとえば、カーソル位置が論理座標であるため、クライアントはこれらの座標を AccessibleObjectFromPoint に渡して、カーソルの下にある要素を取得することはできません。

さらに、フォーカスされた UI 要素を強調表示するアクセシビリティ アプリケーションなど、クライアント領域の外側にウィンドウを作成するアプリケーションでは、ウィンドウは、 IAccessible::accLocation によって返される物理的な座標ではなく、論理座標に配置されるため、適切な画面の場所にウィンドウを作成しません。

ソリューションは次の 2 つの部分に分かれています。

  • クライアント アプリケーションを "dpi 対応" にします。 これを行うには、起動時に SetProcessDPIAware 関数を呼び出します。 この関数は、プロセス全体を dpi に対応させます。つまり、プロセスに属するすべてのウィンドウはスケーリングされません。
  • dpi 対応の関数を使用します。 たとえば、カーソル座標を取得するには、 GetPhysicalCursorPos 関数を 呼び出します。 GetCursorPos を使用しないでください。dpi 対応アプリケーションでの動作は未定義です。

アプリケーションが非 dpi 対応アプリケーションとの直接のクロスプロセス通信を実行する場合は、PhysicalToLogicalPoint 関数と LogicalToPhysicalPoint 関数を使用して論理座標と物理座標の間で変換が行われる可能性があります。