3

在 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 在某个地方获得了“有趣”的值,至少从像素的角度来看这些值是没有意义的。

这些价值观从何而来?
我怎样才能理解这些价值观?

4

1 回答 1

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,因此宽度和高度将 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));
}
于 2013-10-30T21:02:18.067 回答