【问题标题】:GetWindowPlacement/SetWindowPlacement not working in WinForms for high DPIGetWindowPlacement/SetWindowPlacement 在 WinForms 中无法用于高 DPI
【发布时间】:2010-04-09 15:48:49
【问题描述】:
我有一个旧版 WinForms 应用程序,我想跨会话保存窗口位置和大小。在 FormClosing 和 Load 事件期间,我一直在使用 GetWindowPlacement 和 SetWindowPlacement。我遇到的问题是,在较高的 DPI 设置下(例如中等,大小为 125%),大小会不断膨胀。我会以一定的大小调用 SetWindowPlacement,但是当调用 GetWindowPlacement 时,即使窗口一直是相同的大小,这些数字也会变大 25%。在表单中保存可调整大小元素的大小时也存在同样的问题。
现在,如果我创建一个新的 WinForms 项目,这可以正常工作:即使以更高的 DPI 运行,大小也保持稳定。我猜项目的内部有一些遗留设置或一些神秘的表单设置将其搞砸了,但我不知道在哪里。
我在这两个项目上都给IsProcessDPIAware 打电话,而且都是true。有谁知道这可能是什么原因造成的?
【问题讨论】:
标签:
c#
winforms
dpi
window-management
【解决方案1】:
听起来好像您正在以某种方式触发缩放,由表单的 AutoScaleMode 属性选择。您的两个项目之间的区别在于 AutoScaleDimensions 属性,在 Designer.cs 文件中可见。
不确定为什么这会导致问题,但 Form 类已经在内部使用了 GetWindowPlacement()、RecreateHandleCore() 和 UpdateWindowState() 方法。为了获得真正的帮助,我假设您需要在某个地方发布一个重现项目。
【解决方案2】:
我在表单的 .resx 文件中发现了这个有问题的设置:
<data name="$this.AutoScaleBaseSize" type="System.Drawing.Size, System.Drawing">
<value>5, 13</value>
</data>
当它出现时,VS 会自动更改 AutoScaleBaseSize 以适用于您的 DPI,但不会适用于其他人。对于其他人来说,表格会不断增长或缩小。
在设计器属性面板中选择 AutoScaleMode = Font 会导致 VS 启动并“现代化”字体缩放设置。现在它适用于所有 DPI。