SystemInformation.FrameBorderSize返回错误的大小

时间:2012-10-12 10:04:45

标签: .net winforms debugging visual-studio-2012

我在其中一个项目中发现了一个奇怪的问题。问题的确切原因是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版本如何影响系统度量标准?

2 个答案:

答案 0 :(得分:0)

我在msconnect上找到了相关的错误报告:Regression: ::GetSystemMetrics delivers different values

  

这是由于链接器的最小版本在VS 2010中有所不同   与VS 2012.AppCompat垫片基于支持的最低操作系统   由链接器定义,而不是在app上使用的_WIN_32_WINNT值   编译时间。

与之相关的另一个问题:

  1. WinForm dialogs displayed differently by *.vshost.exe and *.exe using VS 2012 when FormBorderStyle set in form codebehind
  2. The SystemInformation.FrameBorderSize property returns a wrong value if a debugger is attached
  3. 不幸的是,所有这些问题都无法修复

答案 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)
    );
  }
}

我知道这是一个黑客。但它的确有效。如果您在平台上显示此将无法修复问题。