如何避免 MDIParent 表单调整大小

2023-12-05

我正在设计一个 Windows 窗体应用程序。我有一个 MDIParent 表单,它以最大化状态加载,并以最大化状态加载其子表单。但是,当我打开 OpenFileDialog 或任何数据读取器对象时,MDIParent 及其所有窗体和控件都会缩小到较小的尺寸。

这个解决方案打开子窗体导致 mdiform 改变大小并收缩不适用于我的情况/工作。

还有这个解决方案https://support.microsoft.com/en-nz/help/967173/restoring-a-maximized-or-minimized-mdi-parent-form-causes-its-height-t不适合我。

一些背景:我在几乎所有 WinForm 应用程序中都看到过这种行为,但我从来没有热衷于解决它。当我开始调查时,我能够缩小到上面突出显示的原因。有些帖子将其描述为 Windows 错误,但对于我来说,只要屏幕分辨率开始高于 1024(VS 2010),它就一直存在。我希望这不仅仅是一个Windows错误......


我希望这不仅仅是一个Windows错误......

功能,不是错误,但它不是 Winforms 程序员非常喜欢的功能。值得注意的是,在过去的几个月里,出现了一些关于神秘的窗口收缩的问题。我think它与Win10秋季创意者版的发布相关。它对旧版 Win32 API 层进行了深刻的更改,并引起了很大的剧变。

在您的具体情况下,“功能”是由 shell 扩展启用的。当您使用 OpenFileDialog 时,它们会被注入到您的进程中。这样做的人非常非常邪恶,并且做了 shell 扩展绝对不能做的事情。它调用设置进程DPIAware()。值得注意的是,它可能是用 WPF 编写的,它有一个非常隐蔽的后门来声明自己为 dpiAware。只需加载PresentationCore 程序集就足够了。但不限于 WPF 代码,任何代码都可以执行此操作,并且可能很长时间未被检测到。

追踪这个邪恶扩展的一种方法是使用 SysInternals 的 AutoRuns 实用程序。它允许您有选择地禁用扩展。不过还有一个程序员的方式,可以在VS中调试这个。

使用“项目”>“属性”>“调试”选项卡> 勾选“启用本机代码调试”复选框。顺便说一句,旧 VS 版本的命名略有不同。然后“调试”>“新断点”>“函数断点”。函数名称=user32!SetProcessDPIAware, 语言 =C。您可以在不执行任何操作的 WPF 应用程序中执行此操作,以确保一切设置正确。为了完整起见,您还可以添加新风格 SetProcessDPIAwareness 的断点。

按 F5 开始调试并触发 OpenFileDialog.ShowDialog() 调用。现在应该命中断点,使用“调试”>“窗口”>“调用堆栈”来查看堆栈跟踪。在您的案例中,您通常看不到任何可识别的内容,因为邪恶代码位于您没有 PDB 的 DLL 中。但是 DLL 名称和位置(在“调试”>“窗口”>“模块”中可见)应该有助于识别您需要向其提交错误的人员。如果您可以没有它,请将其卸载。

最后但并非最不重要的一点是,开始创建 dpiAware 的 Winforms 应用程序变得非常重要,因此这样的错误永远不会被字节。你可以通过以下方式开始声明您的应用程序为 dpiAware因此 DPI 虚拟化被禁用。加上您需要在代码中执行的任何操作,以确保 UI 设计能够正确缩放。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何避免 MDIParent 表单调整大小 的相关文章

随机推荐