加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – GetSystemMetrics()为.NET 4.5和.NET 4.0返回不同的结果

发布时间:2020-12-15 04:26:32 所属栏目:百科 来源:网络整理
导读:在.NET 4.0期间 – .NET 4.5应用程序迁移过程我发现了一种非常奇怪的行为.我已经能够将这个问题跟踪到这个简短的代码片段: class Program{ [System.Runtime.InteropServices.DllImport("user32.dll")] public static extern int GetSystemMetrics(int nInde
在.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)编译时,它输出8×8

使用Target Framework = 4.5编译时,它输出4×4

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

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

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

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

问题:

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

我对解决这个问题的任何建议持开放态度.此外,如果您无法重现该问题,请在评论中留下简短的系统说明.

解决方法

根据微软的说法,这是按设计的.

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

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说这是“按设计”,但我仍然认为这是一个错误!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读