1

我在我的一个项目中发现了这个奇怪的问题。问题的确切原因是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 ) 得到相同的(不正确的)结果。

更新:
当项目的目标框架设置为“.Net Framework 3.5 客户端配置文件”并进行调试时,我们得到不正确的结果 (4,4)。当目标框架是“.Net Framework 4.5”时,无论是否调试,我们总是得到不正确的结果(4,4)。

有人会告诉我为什么会发生这种情况(此代码在同一台机器上的 VS2010/VS2008/VS2005 下正常工作)?VS2012 调试器或 .Net Framework 版本如何影响系统指标?

4

2 回答 2

0

我在 msconnect 上找到了一个相关的错误报告:回归:::GetSystemMetrics 提供不同的值

这是因为 VS 2010 与 VS 2012 中链接器的最低版本不同。AppCompat shim 基于链接器定义的最低支持操作系统,而不是应用程序编译时使用的 _WIN_32_WINNT 值。

与之相关的另一个问题:

  1. 当 FormBorderStyle 在表单代码隐藏中设置时,*.vshost.exe 和 *.exe 使用 VS 2012 以不同方式显示 WinForm 对话框
  2. 如果附加了调试器,则 SystemInformation.FrameBorderSize 属性返回错误值

不幸的是,所有这些问题都无法解决

于 2013-10-23T13:03:49.353 回答
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)
    );
  }
}

我知道这是一个黑客。但它有效。如果您在显示此内容的平台上无法解决问题。

于 2015-11-30T23:10:04.730 回答