在.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台计算机上重现这个问题,不幸的是它们在安装的软件方面几乎完全相同:
目前我正在考虑修补一些.NET类(例如SystemParameters
),它使用反射调用GetSystemMetrics()
,但我不确定如何获得正确的度量值。
问题:
GetSystemMetrics()
如何受目标框架的影响?我愿意接受有关解决此问题的任何建议。此外,如果您无法重现该问题,请在评论中留下简短的系统说明。
答案 0 :(得分:5)
所以,它实际上是一种设计行为,如果有人有类似的问题,这里的代码总是输出相同的结果:
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的一部分,不知道这些更改并显示凌乱的窗口边框(幸运的是,我认为它可以是使用修改后的样式修复。
答案 1 :(得分:3)
根据微软的说法,这是按照设计的。
详情请见此处:
尽管MS说这是“按设计”,但我仍然认为这是一个错误!