我在其中一个项目中发现了一个奇怪的问题。问题的确切原因是SystemInformation.FrameBorderSize返回不同的值取决于应用程序是否在VS2012中运行在调试器下运行。 我正在使用以下测试:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
protected override void OnLoad(EventArgs e) {
base.OnLoad(e);
this.label1.Text = SystemInformation.FrameBorderSize.ToString();
}
}
在调试器下,它返回错误的大小(4,4)
,但在调试器下不会返回正确的值(8,8)
。相关的WinAPI调用(GetSystemMetrics)获得相同(不正确)的结果。
更新
当项目的Target Framework设置为“.Net Framework 3.5 Client Profile”并进行调试时,我们得到的结果不正确(4,4)。
当目标框架“.Net Framework 4.5”调试与否时,我们总是得到不正确的结果(4,4)。
有人会向我提供一个信息,为什么会发生这种情况(此代码在同一台机器上的VS2010 / VS2008 / VS2005下正常工作)? VS2012调试器或.Net Framework版本如何影响系统度量标准?
答案 0 :(得分:0)
我在msconnect上找到了相关的错误报告:Regression: ::GetSystemMetrics delivers different values:
这是由于链接器的最小版本在VS 2010中有所不同 与VS 2012.AppCompat垫片基于支持的最低操作系统 由链接器定义,而不是在app上使用的_WIN_32_WINNT值 编译时间。
与之相关的另一个问题:
答案 1 :(得分:0)
如果您正在受影响的平台上构建,请检查 Debugger.IsAttached ,如果返回 true ,请将 SystemInformation.FrameBorderSize
像这样:
public static Size RealFrameBorder {
get {
return new Size(
SystemInformation.FrameBorderSize.Width * (Debugger.IsAttached ? 2 : 1),
SystemInformation.FrameBorderSize.Height * (Debugger.IsAttached ? 2 : 1)
);
}
}
我知道这是一个黑客。但它的确有效。如果您在平台上显示此将无法修复问题。