7

.NET 4.0 -> .NET 4.5 アプリケーションの移行プロセス中に、非常に奇妙な動作を発見しました。この短いコード スニペットまで、この問題を追跡することができました。

class Program
{
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern int GetSystemMetrics(int nIndex);

    static void Main(string[] args)
    {
        const int CXFRAME = 0x20;
        const int CYFRAME = 0x21;

        var dx = GetSystemMetrics(CXFRAME);
        var dy = GetSystemMetrics(CYFRAME);

        Console.WriteLine("{0}x{1}", dx, dy);
        Console.ReadKey();
    }
}

Target Framework = 4.0(および2.0、3.0、3.5)でコンパイルすると、出力されます8x8

でコンパイルするとTarget Framework = 4.5、出力されます4x4

このサンプルを MSVS2012 デバッガーで実行すると、常に出力も出力されます4x4(任意のターゲット フレームワークを使用)。

他のオプション (ターゲット フレームワーク プロファイル、ターゲット プラットフォーム、Aero の有効化/無効化) は結果に影響しません。出力を変更するのは、ターゲット フレームワークとデバッガーでの実行だけです。この問題は 3 台のコンピューターで再現できましたが、残念ながら、インストールされているソフトウェアに関してはほとんど同じです。

  • Windows 7 Ultmate SP1 (ロシア語、すべての更新プログラムがインストール済み)、MSVS2012 (英語/ロシア語) Update 1
  • Windows 8 (仮想マシン上)

SystemParameters現在、リフレクションを使用して呼び出すいくつかの .NET クラス (たとえば) にパッチを適用することを考えていますGetSystemMetrics()が、正しいメトリック値を取得する方法がわかりません。

質問:

  • 何か不足していますか?GetSystemMetrics()ターゲット フレームワークによってどのように影響を受ける可能性がありますか?
  • GetSystemMetrics().NET 4.5 アプリから呼び出して正しい結果を得る方法はありますか?

この問題を解決するための提案をお待ちしております。また、問題を再現できない場合は、システムの簡単な説明をコメントに残してください。

4

2 に答える 2

6

したがって、実際には設計上の動作であり、誰かが同様の問題を抱えている場合、常に同じ結果を出力するコードは次のとおりです。

const int CXFRAME = 0x20;
const int CYFRAME = 0x21;
const int CXPADDEDBORDER = 92;

var dx = GetSystemMetrics(CXFRAME);
var dy = GetSystemMetrics(CYFRAME);
var d  = GetSystemMetrics(CXPADDEDBORDER);
dx += d;
dy += d;

Console.WriteLine("{0}x{1}", dx, dy);
Console.ReadKey();

また、.NET 4.5RibbonWindowを使用し、現在その一部として提供されている WPF コントロールは、WindowChromeこの変更を認識せず、乱雑なウィンドウ境界を表示することに注意してください (幸い、変更されたスタイルを使用して修正できると思います)。

于 2013-02-06T10:18:48.273 に答える
3

Microsoft によると、これは仕様によるものです。

詳細については、こちらを参照してください。

MS は「仕様による」と言っていますが、それでもバグだと思います。

于 2013-02-06T09:56:50.633 に答える