.NET SystemInformation.PrimaryMonitorMaximizedWindowSize显示大于PrimaryMonitorSize

在Winforms应用程序上工作的代码设置初始窗口状态。
它使用SystemInformation.PrimaryMonitorMaximizedWindowSize
通常程序似乎function,但是当我在debugging器中看到SystemInformation时,我看到以下内容:

PrimaryMonitorMaximizedWindowSizeWidth = 1696, Height = 1026
PrimaryMonitorSizeWidth = 1680, Height = 1050

PrimaryMonitorSize是我的显示器的分辨率,这是有道理的。

PrimaryMonitorMaximizedWindowSize 1026高度感觉正确(1050 – 1026 = 24)
24像素似乎是Windows任务栏的大小。

然后我解锁并调整了Windows任务栏的两倍。
使用像素标尺测量,它显示为大约80像素。 不过,我现在得到这个PrimaryMonitorSizeWidth = 1680, Height = 984 。 实际的窗口区域似乎在970像素左右。

某处.NET正在获得“有趣”的价值,至less从像素的angular度来看是没有意义的。

这些价值从哪里来?
我怎样理解这些价值呢?

不是说这将是最好的答案,但我会尽力解决这个问题。

SystemImformation在user32 DLL中调用至少两个本地API调用。

  • GetSystemMetrics (1)
  • SystemParametersInfo (2)
    (1)和(2)用于从下表中引用

有了一个小帮手(见这个答案的结尾),我获得了以下值,基本上可以洞察所观察到的行为。 在下表中,我显示了属性,我的框中的值以及调用了哪个本机API和提供的参数。 例如“(1)32”表示以32作为参数调用GetSystemMetrics 。 两个数字表示API被调用两次。

 | SystemInformation | Value | native api | --------------------------------------------------------------------------------------- | FrameBorderSize | {Width=8, Height=8} | (1) 32 33 | PrimaryMonitorMaximizedWindowSize | {Width=1296, Height=916} | (1) 61 62 | PrimaryMonitorSize | {Width=1280, Height=1024} | (1) 0 1 | WorkingArea | {X=0,Y=0,Width=1280,Height=984} | (2) 48 

PrimaryMonitorSize的大小实际上就是你的视频卡报告的大小(API也提到了一个相当于GetDeviceCaps调用)。

由于WorkingArea是除了停靠的工具栏和任务栏以外的屏幕边界,如果您只有一个任务 ,则可以推断我的任务栏的高度为1024-984 = 40像素左右。
PrimaryMonitorMaximizedWindowSize是窗口应该覆盖工作区域的大小, 不包括窗口边框。 由于FrameBorderSize在两个方向上都是8,所以width和heigth得到2 * 8 = 16加上了WorkingArea大小,因此给出了1296和916的大小以适合我的WorkingArea

如果我解锁我的任务栏,并调整它的工作区的新值WorkingArea:{X=0,Y=0,Width=1280,Height=942}显示额外的行是42像素。

如何转储属性

 foreach(var p in typeof(SystemInformation).GetProperties().OrderBy(n => n.Name)) { Console.WriteLine("{0}:{1}", p.Name, p.GetValue(null,null)); }