GetSystemMetrics的()返回.NET 4.5&.NET 4.0不同的结果(GetSys

2019-07-19 09:25发布

在一个.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任何目标框架)。

其他选项(目标框架型材,目标平台,启用/禁用航空)不影响结果,改变输出的唯一的东西是目标框架,并与调试器中运行。 我已经能够重现上3台电脑这个问题,遗憾的是他们在安装软件方面几乎相同:

  • Windows 7的SP1 Ultmate(俄罗斯,所有更新安装)与MSVS2012(英语/ rusian)更新1
  • Windows 8的(虚拟机)

目前我正在考虑修补一些.NET类( SystemParameters为例),其调用GetSystemMetrics()使用反射,但我不知道怎么去正确的度量值。

问题:

  • 我缺少的东西吗? 如何GetSystemMetrics()可以通过目标框架的影响?
  • 有没有什么办法来调用GetSystemMetrics()从.NET 4.5的应用程序,并得到正确的结果?

我愿意就解决这个问题的任何建议。 另外,如果您不能重现该问题,请留下评论在很短的系统描述。

Answer 1:

据微软称,这是特意设计的。

看到这里的全部细节:

http://connect.microsoft.com/VisualStudio/feedback/details/763767/the-systemparameters-windowresizeborderthickness-seems-to-return-incorrect-value

https://connect.microsoft.com/VisualStudio/feedback/details/753224/regression-getsystemmetrics-delivers-different-values

尽管MS说这是“设计”,我仍然认为这是一个错误!



Answer 2:

因此,它实际上是一个由设计行为,如果有人有类似的问题,这里是总是输出相同的结果的代码:

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的一部分不知道这个变化,并显示凌乱的窗口边框(幸运的是,我认为它可以使用修改后的样式固定)。



文章来源: GetSystemMetrics() returns different results for .NET 4.5 & .NET 4.0