C# GetWindowPlacement/SetWindowPlacement在WinForms中无法用于高DPI

C# GetWindowPlacement/SetWindowPlacement在WinForms中无法用于高DPI,c#,winforms,dpi,window-management,C#,Winforms,Dpi,Window Management,我有一个旧版WinForms应用程序,我想在会话中保存窗口位置和大小。在FormClosing和Load事件期间,我一直在使用和。我遇到的问题是,在较高的DPI设置下(如中等,大小为125%),大小会不断膨胀。我会以一定的大小调用SetWindowPlacement,但是当调用GetWindowPlacement时,这些数字会变大25%,即使窗口一直都是相同的大小。在表单中保存可调整大小的元素的大小时,也存在同样的问题 现在,如果我创建了一个新的WinForms项目,它就可以正常工作了:即使在较

我有一个旧版WinForms应用程序,我想在会话中保存窗口位置和大小。在FormClosing和Load事件期间,我一直在使用和。我遇到的问题是,在较高的DPI设置下(如中等,大小为125%),大小会不断膨胀。我会以一定的大小调用SetWindowPlacement,但是当调用GetWindowPlacement时,这些数字会变大25%,即使窗口一直都是相同的大小。在表单中保存可调整大小的元素的大小时,也存在同样的问题

现在,如果我创建了一个新的WinForms项目,它就可以正常工作了:即使在较高的DPI下运行,大小也保持稳定。我猜在这个项目的内部有一些遗留的设置或者一些神秘的形式设置把它搞砸了,但是我不知道在哪里


我访问了这两个项目,它们都是
true
。有人知道是什么原因导致了这种情况吗?

听起来像是您在某种程度上触发了缩放,这是由表单的AutoScaleMode属性选择的。两个项目之间的区别在于AutoScaleDimensions属性,该属性在Designer.cs文件中可见


不确定这会导致问题的原因,但Form类已在内部使用GetWindowPlacement()、RecreateHandleCore()和UpdateWindowState()方法。要获得真正的帮助,我假设您需要在某处发布一个repo项目。

我在表单的.resx文件中发现了这个令人不快的设置:

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

5, 13
当出现这种情况时,VS会自动更改AutoScaleBaseSize以适用于您的DPI,但不会更改其他DPI。对于其他人来说,形体会不断地增长或收缩

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