在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正在获得“有趣”的值,至少从像素的角度看是没有意义的。
这些价值来自哪里?
我怎样才能理解这些价值观?
答案 0 :(得分:1)
不是说这是最好的答案,但我会尝试解决这个问题。
引擎盖下SystemImformation
正在调用user32 DLL中的至少两个本机API调用。
GetSystemMetrics
(1)SystemParametersInfo
(2)使用小帮手(参见本答案的结尾),我获得了以下值,基本上可以深入了解所观察到的行为。在下表中,我展示了属性,我的框中的值以及调用的本机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));
}