如何避免MDIParent表单调整大小

时间:2018-03-24 05:22:09

标签: winforms mdichild mdiparent

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

此解决方案Opening child form is causing mdiform to change size and shrink不适用于我的情况。

此解决方案https://support.microsoft.com/en-nz/help/967173/restoring-a-maximized-or-minimized-mdi-parent-form-causes-its-height-t也不适用于我。

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

1 个答案:

答案 0 :(得分:4)

  

我希望它不仅仅是一个Windows bug ......

功能,不是错误,但它不是Winforms程序员非常喜欢的。值得注意的是,过去几个月里有几个关于窗口缩小的问题。我认为它与Win10 Fall Creators版本的发布有关。它对传统的Win32 api层进行了深刻的改动,并且它们引起了大量的剧变。

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

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

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

按F5开始调试并触发OpenFileDialog.ShowDialog()调用。断点现在应该命中,使用Debug> Windows>调用Stack来查看堆栈跟踪。在您的情况下,您通常不会看到任何可识别的内容,因为恶意代码存在于您没有PDB的DLL中。但DLL名称和位置(在Debug> Windows> Modules中可见)应该有助于识别提交bug所需的人。如果没有它就可以将其卸载。

最后但同样重要的是,开始创建dpiAware的Winforms应用程序变得非常重要,因此这样的bug永远不会出现字节。您可以通过declaring your app to be dpiAware启动它,以便禁用DPI虚拟化。此外,您需要在代码中执行任何操作,以确保UI设计正确扩展。