GetSystemMetrics() returns different results for .NET 4.5 & .NET 4.0

Solution 1:

So, it's actually a by-design behavior, and if someone has similar issues, here is the code which always outputs the same result:

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();

Also note that RibbonWindow WPF control, which uses WindowChrome and now comes as a part of .NET 4.5 does not know about this changes and displays messy window borders (fortunately, I think it can be fixed using modified styles).

Solution 2:

According to Microsoft, this is by-design.

See here for full details:

  • The SystemParameters.WindowResizeBorderThickness seems to return incorrect value - Microsoft Connect (no archived version available)
  • Regression: ::GetSystemMetrics delivers different values - Microsoft Connect (archived)

Despite MS saying it's "by design", I still think it's a bug!