.NET SystemInformation.PrimaryMonitorMaximizedWindowSize显示大于PrimaryMonitorSize

时间:2013-08-14 15:46:44

标签: c# .net windows winforms

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

PrimaryMonitorMaximizedWindowSize Width = 1696,Height = 1026
PrimaryMonitorSize Width = 1680,Height = 1050

PrimaryMonitorSize是我的显示器的分辨率,因此有意义。

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

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

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

这些价​​值来自哪里?
我怎样才能理解这些价值观?

1 个答案:

答案 0 :(得分:1)

不是说这是最好的答案,但我会尝试解决这个问题。

引擎盖下SystemImformation正在调用user32 DLL中的至少两个本机API调用。

使用小帮手(参见本答案的结尾),我获得了以下值,基本上可以深入了解所观察到的行为。在下表中,我展示了属性,我的框中的值以及调用的本机API和提供的参数。例如,“(1)32”表示调用GetSystemMetrics,其中32作为参数。两个数字表示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,因此宽度和高度会增加到WorkingArea大小的2 * 8 = 16,因此在我的WorkingArea中提供1296和916的大小。

如果我解锁任务栏并调整其大小,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));
}