【问题标题】:GetSystemMetrics() returns different results for .NET 4.5 & .NET 4.0GetSystemMetrics() 为 .NET 4.5 和 .NET 4.0 返回不同的结果
【发布时间】:2013-02-06 09:38:55
【问题描述】:

在 .NET 4.0 -> .NET 4.5 应用程序迁移过程中,我发现了一个非常奇怪的行为。我已经能够将此问题追溯到这个短代码 sn-p:

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(使用 any 目标框架)。

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

  • Windows 7 Ultmate SP1(俄语,已安装所有更新)和 MSVS2012(英语/俄语)更新 1
  • Windows 8(在虚拟机上)

目前我正在考虑修补一些 .NET 类(例如 SystemParameters),它们使用反射调用 GetSystemMetrics(),但我不确定如何获得正确的指标值。

问题:

  • 我错过了什么吗? GetSystemMetrics() 怎么会受到目标框架的影响?
  • 有什么方法可以从 .NET 4.5 应用调用 GetSystemMetrics() 并获得正确的结果?

我愿意接受有关解决此问题的任何建议。另外,如果您无法重现该问题,请在 cmets 中留下简短的系统描述。

【问题讨论】:

    标签: c# .net-4.0 .net-4.5 getsystemmetrics


    【解决方案1】:

    所以,这实际上是一种设计行为,如果有人有类似的问题,这里的代码总是输出相同的结果:

    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 问题,请查看以下答案:stackoverflow.com/a/61299269/1943849,如果您尝试修复最大化的窗口,这会有所帮助。
    【解决方案2】:

    根据 Microsoft 的说法,这是设计使然。

    详情请看这里:

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

    【讨论】:

    • 谢谢,这说明了一切。
    • 太糟糕了,这些链接已关闭。我想知道是否有人仍然有那里给出的解释。
    猜你喜欢
    • 2012-05-16
    • 1970-01-01
    • 2013-09-14
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    相关资源
    最近更新 更多