C# GetSystemMetrics()为.NET 4.5&;返回不同的结果。NET 4.0

C# GetSystemMetrics()为.NET 4.5&;返回不同的结果。NET 4.0,c#,.net-4.0,.net-4.5,getsystemmetrics,C#,.net 4.0,.net 4.5,Getsystemmetrics,在.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) {

在.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();
    }
}
当使用
targetframework=4.0
(以及2.0、3.0、3.5)编译时,它输出
8x8

当使用
targetframework=4.5
编译时,它输出
4x4

使用MSVS2012调试器运行此示例也始终输出
4x4
(使用任何目标框架)

其他选项(目标框架概要文件、目标平台、启用/禁用Aero)不会影响结果,唯一改变输出的是目标框架和使用调试器运行。我已经能够在3台计算机上重现这个问题,不幸的是,它们在安装软件方面几乎完全相同:

  • Windows 7 Ultmate SP1(俄语,已安装所有更新)和MSVS2012(英语/俄语)更新1
  • Windows 8(在虚拟机上)
目前我正在考虑修补一些.NET类(例如,
SystemParameters
),它们使用反射调用
GetSystemMetrics()
,但我不确定如何获得正确的度量值

问题:

  • 我错过什么了吗?目标框架如何影响
    GetSystemMetrics()
  • 有没有办法从.NET 4.5应用程序调用
    GetSystemMetrics()
    ,并获得正确的结果

我愿意接受任何关于解决这个问题的建议。此外,如果您无法重现该问题,请在备注中留下简短的系统说明。

根据Microsoft的说法,这是出于设计

有关详细信息,请参见此处:

  • (没有可用的存档版本)
  • ()

尽管微软说这是“设计的”,但我仍然认为这是一个bug

因此,这实际上是一种按设计的行为,如果有人有类似的问题,下面的代码总是输出相同的结果:

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();

还要注意的是,
RibbonWindow
WPF控件,它使用了
WindowChrome
,现在作为.NET 4.5的一部分出现,但它不知道这些更改,并且显示混乱的窗口边框(幸运的是,我认为可以使用修改过的样式进行修复)。

谢谢,这就解释了一切。那些链接被关闭太糟糕了。我想知道是否还有人在那里给出了解释。非常有用的注释,谢谢。最初它不是设计出来的,它被确认是一个windows错误。关于
WindowsChrome
问题,请检查以下答案:,如果您试图修复最大化窗口,这会有所帮助。