Winforms 如何避免父窗体调整大小

Winforms 如何避免父窗体调整大小,winforms,mdichild,mdiparent,Winforms,Mdichild,Mdiparent,我正在设计一个Windows窗体应用程序。我有一个以最大化状态加载的MDI父窗体,也以最大化状态加载其子窗体。但是,当我打开OpenFileDialog或任何datareader对象时,MDIParent及其所有窗体和控件都会缩小 此解决方案不适用于我的情况 这个解决方案对我也不起作用 一些背景:我几乎在我所有的WinForm应用程序中都看到过这种行为,但我从未热衷于解决它。当我开始调查时,我能够缩小到上面强调的原因。一些帖子将其描述为windows bug,但就我的情况而言,只要屏幕分辨率开始

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

此解决方案不适用于我的情况

这个解决方案对我也不起作用

一些背景:我几乎在我所有的WinForm应用程序中都看到过这种行为,但我从未热衷于解决它。当我开始调查时,我能够缩小到上面强调的原因。一些帖子将其描述为windows bug,但就我的情况而言,只要屏幕分辨率开始超过1024(与2010年相比),它就一直存在。我希望这不仅仅是一个windows bug

我希望这不仅仅是一个windows bug

特性,不是bug,但Winforms程序员并不喜欢它。值得注意的是,在过去的几个月里,有几个关于神秘化窗户收缩的问题。我认为这与Win10秋季创作者版的发布有关。它对传统的Win32 api层进行了深刻的更改,并导致了大量的剧变

在您的特定情况下,“功能”由shell扩展启用。当您使用OpenFileDialog时,它们会被注入到您的流程中。这样做是非常非常邪恶的,并且做了shell扩展绝对不能做的事情。它叫。值得注意的是,它可能是用WPF编写的,它有一个非常隐蔽的后门来声明自己是dpiAware。只需加载PresentationCore程序集就足够了。但不限于WPF代码,任何代码都可以做到这一点,而且可能在很长一段时间内未被检测到

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

使用项目>属性>调试选项卡>勾选“启用本机代码调试”复选框。在旧版本和btw版本中命名略有不同。然后调试>新断点>函数断点。函数名=
user32!SetProcessDPIAware
,语言=
C
。您可以在do nothing WPF应用程序中执行此操作,以确保所有设置都正确。为了完整性,您还可以为SetProcessDPIAwareness添加断点,即新的风格

按F5开始调试并触发OpenFileDialog.ShowDialog()调用。现在应该命中断点,使用Debug>Windows>callstack查看堆栈跟踪。在您的案例中,您通常不会看到任何非常容易识别的东西,因为恶意代码存在于一个DLL中,而您没有PDB。但是DLL名称和位置(在Debug>Windows>Modules中可见)应该有助于识别需要向其提交bug的人。如果没有它,请卸载它


最后但并非最不重要的一点是,开始创建使用dpiAware的Winforms应用程序变得非常重要,这样就永远不会出现这样的错误。您可以通过禁用DPI虚拟化来启动此功能。再加上您需要在代码中执行的任何操作,以确保UI设计能够正确伸缩。

感谢Hans的解释。我遵循了你的步骤,但是我在模块中迷失了方向。。。我不知道应该从大约100个DLL列表中删除/卸载哪个文件?100,哎哟。这就是我建议使用调试器的原因。你仍然可以通过反复禁用其中的一半来对付100个。50,25,13,7,4,2,1,只有7个人试图让马克斯找到作恶者。二进制搜索解决了一个计算机问题,呵呵。不过,那个么,你们指给我的答案就解决了!