GetWindowPlacement/SetWindowPlacement not working in WinForms for high DPI
我有一个旧版WinForms应用程序,我想在各个会话中保存窗口的位置和大小。我在FormClosing和Load事件期间一直在使用GetWindowPlacement和SetWindowPlacement。我遇到的问题是,在较高的DPI设置(例如,中等,尺寸为125%)下,尺寸会不断膨胀。我将以一定的大小在其上调用SetWindowPlacement,但是当调用GetWindowPlacement时,即使窗口大小始终相同,这些数字也会增加25%。在窗体中保存可调整大小的元素的大小时,存在相同类型的问题。
现在,如果我创建一个新的WinForms项目,此方法就可以正常工作:即使以更高的DPI运行,大小仍保持稳定。我猜项目的肠子里有一些旧设置,或者有些奥秘的Form设置使它搞砸了,但我找不到位置。
我在两个项目中都调用了IsProcessDPIAware,并且都为
我在表单的.resx文件中找到了该违规设置:
1 2 3 | <data name="$this.AutoScaleBaseSize" type="System.Drawing.Size, System.Drawing"> <value>5, 13</value> </data> |
如果存在此选项,VS会自动更改AutoScaleBaseSize以使其适用于您的DPI,但没有其他人可以使用。对于其他所有人,该形式将不断增长或缩小。
在设计器属性面板中选择AutoScaleMode = Font导致VS介入并"现代化"字体缩放设置。现在,它适用于所有DPI。
像您这样的声音以某种方式触发了缩放,这是由窗体的AutoScaleMode属性选择的。两个项目之间的区别是在Designer.cs文件中可见的AutoScaleDimensions属性。
不确定为什么会导致问题,但是Form类已经在内部使用了GetWindowPlacement(),RecreateHandleCore()和UpdateWindowState()方法。为了获得真正的帮助,我想您需要在某个地方发布一个repro项目。