c# - .NET SystemInformation.PrimaryMonitorMaximizedWindowSize 显示大于 PrimaryMonitorSize

标签 c# .net windows winforms

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

PrimaryMonitorMaximizedWindowSize:宽度 = 1696,高度 = 1026
PrimaryMonitorSize:宽度 = 1680,高度 = 1050

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

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

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

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

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

最佳答案

并不是说这将是最佳答案,但我会尝试解决这个问题。

在引擎盖下SystemImformation在 user32 DLL 中调用至少两个 native API 调用。

借助一个小 helper (请参阅此答案的末尾),我获得了以下值,这些值基本上可以让您深入了解所观察到的行为。在下表中,我显示了属性、框上的值以及调用了哪个 native 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 是屏幕的边界,不包括停靠的工具栏和 taskbar,如果你只有一个任务栏,你可以推断我的任务栏的高度大约是 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));
}

关于c# - .NET SystemInformation.PrimaryMonitorMaximizedWindowSize 显示大于 PrimaryMonitorSize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18236364/

相关文章:

c# - C#中的文件创建时间

c# - Lambda 表达式中的动态 Where 子句

c# - RIA 服务 WCF 超时

.net - 强制 OleDbConnection 释放文件句柄

C++如何让两个程序进行通信?

c# - Spreadsheetgear 在加载时删除数据透视表 : can it ignore certain sheets?

c# - 如何在定义的位置弹出工具窗口

windows - 为什么我不能终止这个 while 循环?

使用多个编译器编译 C 代码

c# - 从 WPF 中的 ViewModel 动态生成简单 View ?