2

私のアプリケーションでは、次のコードで画面解像度を取得します。

SystemInformation.PrimaryMonitorSize

そして、私はこのコードでDPIを取得します:

    using (Graphics g = Graphics.FromHdc(NativeMethods.GetDC(IntPtr.Zero)))
    {
        dpiX = g.DpiX;
        dpiY = g.DpiY; 
    }

これはほとんどの状況で正常に機能します。ただし、AeroがオンになっているVistaマシンでコードを実行し、ユーザーが高DPIを使用するようにモニターを設定すると、奇妙な結果が返されます。

ユーザーがマシンを1024x768で実行するように設定し、DPIを144に設定したとすると、上記のコードは683x512の解像度と96のDPIを返します。

ただし、Aeroをオフにすると、期待どおりの結果が返されます。Aeroは何をしていて、どうすれば真の解像度とDPIを取得できますか?

4

2 に答える 2

7

マニフェスト(推奨)で、またはWin32 API関数を使用して、アプリケーションをDPI対応として宣言する必要があります。SetProcessDPIAware非常に多くのアプリケーションが適切に記述されていないため、Vistaは「DPI仮想化」を追加しました。これにより、アプリケーションは「標準」の96dpi画面で動作しているように見せかけ、スケーリング自体を実行できます。コンポジットウィンドウマネージャーであるDWMで実行できます。スケーリング。アプリケーションがさまざまなDPIを適切に処理する場合は、そのように明示的に指定する必要があります。

HWND_DESKTOPちなみに、あなたは(それが何であるか)をいじってはいけません(HWND)0。合成( "Aero")がオフの場合、実際には物理画面を表しているため、DCを取得して描画すると、フレームバッファーに直接描画されます。コンポジットウィンドウマネージャーでは、これは定義上不可能です。これがDPI測定に影響するかどうかはわかりませんが、とにかく代わりにアプリケーションウィンドウにDCを使用することをお勧めします-害はありません/

于 2009-08-26T18:47:00.937 に答える
0

これらのリンクも有用な情報を提供します。

http://msdn.microsoft.com/en-us/library/dd464660(VS.85).aspx

http://blogs.msdn.com/greg_schechter/archive/2006/08/07/690704.aspx

于 2009-08-26T19:57:42.713 に答える