在 .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
(with any目标框架)。
其他选项(目标框架配置文件、目标平台、启用/禁用 Aero)不会影响结果,唯一改变输出的是目标框架和使用调试器运行。我已经能够在 3 台计算机上重现此问题,不幸的是它们在安装的软件方面几乎相同:
- Windows 7 Ultimate SP1(俄语,已安装所有更新)和 MSVC 2012(英语/俄语)更新 1
- Windows 8(在虚拟机上)
目前我正在考虑修补一些 .NET 类(SystemParameters
例如),它调用GetSystemMetrics()
使用反射,但我不确定如何获得正确的指标值。
问题:
- 我错过了什么吗?怎么能
GetSystemMetrics()
受目标框架影响吗?
- 有什么办法可以打电话吗
GetSystemMetrics()
来自 .NET 4.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 的一部分不知道此更改并显示混乱的窗口边框(幸运的是,我认为可以使用修改后的样式来修复它)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)