在Winforms应用程序上工作的代码设置初始窗口状态。
它使用SystemInformation.PrimaryMonitorMaximizedWindowSize
。
通常程序似乎function,但是当我在debugging器中看到SystemInformation
时,我看到以下内容:
PrimaryMonitorMaximizedWindowSize
: Width
= 1696, Height
= 1026
PrimaryMonitorSize
: Width
= 1680, Height
= 1050
PrimaryMonitorSize
是我的显示器的分辨率,这是有道理的。
PrimaryMonitorMaximizedWindowSize
1026高度感觉正确(1050 – 1026 = 24)
24像素似乎是Windows任务栏的大小。
然后我解锁并调整了Windows任务栏的两倍。
使用像素标尺测量,它显示为大约80像素。 不过,我现在得到这个PrimaryMonitorSize
: Width
= 1680, Height
= 984 。 实际的窗口区域似乎在970像素左右。
某处.NET正在获得“有趣”的价值,至less从像素的angular度来看是没有意义的。
这些价值从哪里来?
我怎样理解这些价值呢?
不是说这将是最好的答案,但我会尽力解决这个问题。
SystemImformation
在user32 DLL中调用至少两个本地API调用。
GetSystemMetrics
(1) SystemParametersInfo
(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)); }