GetWindowPlacement / SetWindowPlacement在WinForms中不能用于高DPI

时间:2010-04-09 15:48:50

标签: c# winforms dpi window-management

我有一个传统的WinForms应用程序,我希望在会话中保存窗口位置和大小。我在FormClosing和Load事件期间一直使用GetWindowPlacementSetWindowPlacement。我得到的问题是,在较高的DPI设置(例如中等,大小为125%)下,尺寸会持续膨胀。我会用一定的大小调用SetWindowPlacement,但是当调用GetWindowPlacement时,这些数字会回来大25%,即使窗口一直都是相同的大小。在表单中保存可调整大小元素的大小时存在同样的问题。

现在,如果我创建一个新的WinForms项目,这可以正常工作:即使在较高的DPI下运行,大小也会保持稳定。我猜测项目内容中有一些遗留设置,或者某些神秘的Form设置搞砸了,但我找不到它。

我在两个项目上都调用了IsProcessDPIAware,两者都是true。有谁知道可能导致这种情况的原因?

2 个答案:

答案 0 :(得分:1)

听起来像是以某种方式触发缩放,正如表单的AutoScaleMode属性所选择的那样。两个项目之间的区别在于AutoScaleDimensions属性,可在Designer.cs文件中看到。

不确定为什么这会导致问题,但Form类已经在内部使用了GetWindowPlacement(),重新使用了RecreateHandleCore()和UpdateWindowState()方法。为了获得真正的帮助,我认为你需要在某个地方发布一个repro项目。

答案 1 :(得分:1)

我在表单的.resx文件中找到了这个有问题的设置:

<data name="$this.AutoScaleBaseSize" type="System.Drawing.Size, System.Drawing">
  <value>5, 13</value>
</data>

如果存在,VS会自动更改AutoScaleBaseSize以用于您的 DPI,但没有其他人。对于其他人来说,表格会不断增长或缩小。

在设计器属性面板中选择AutoScaleMode = Font会导致VS启动并“缩小”字体缩放设置。现在它适用于所有DPI。