首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免MDIParent窗体调整大小

如何避免MDIParent窗体调整大小
EN

Stack Overflow用户
提问于 2018-03-24 05:22:09
回答 1查看 319关注 0票数 1

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

此解决方案打开子窗体会导致mdiform更改大小和收缩。不适用/在我的情况下工作。

而且,这个解决方案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)时,它就已经存在了。我希望这不仅仅是个窗户窃听器..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-24 09:16:41

我希望这不仅仅是个窗户窃听器..。

特性,不是一个bug,但它不是Winforms程序员非常喜欢的。值得注意的是,在过去的几个月里,关于令人费解的窗口缩小有几个问题。我认为这与Win10秋季创建者版的发布有关。它对遗留的Win32 api层进行了深刻的更改,并引发了许多剧变。

在您的具体情况下,“功能”是通过shell扩展启用的。当您使用OpenFileDialog时,它们会被注入到您的流程中。这样做的人是非常非常邪恶的,并且做一些shell扩展绝对不能做的事情。它叫SetProcessDPIAware()。值得注意的是,它可能是用WPF编写的,它有一个非常诡秘的后门来声明自己为dpiAware。仅仅加载PresentationCore程序集就足够了。但是,不局限于WPF代码,任何代码都可以做到这一点,而且这可能在很长一段时间内没有被检测到。

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

使用Project > Properties > Debug选项卡>勾选“启用本机代码调试”复选框。在旧版本和版本中命名略有不同。然后调试>新断点>函数断点。函数名称= user32!SetProcessDPIAware,Language = C。您可以在一个无所事事的WPF应用程序中练习这一点,以确保所有设置都正确。为了完整,您还可以为SetProcessDPIAwareness添加断点,这是一种新的风格。

按F5开始调试并触发OpenFileDialog.ShowDialog()调用。现在应该命中断点,使用Debug > Windows > Call Stack查看堆栈跟踪。您通常不会看到任何在您的情况下非常容易识别的东西,因为邪恶的代码驻留在一个您没有PDB的DLL中。但是DLL的名称和位置(在Debug > Windows >Modules中是可见的)应该有助于识别您需要与之一起提交bug的人。如果没有它你就可以卸载它。

最后但并非最不重要的一点是,开始创建属于dpiAware的Winforms应用程序变得非常重要,这样一个bug就不会被字节化。您可以通过声明您的应用程序为dpiAware启动此操作,从而禁用DPI虚拟化。此外,在您的代码中需要做的任何事情,以确保UI设计的适当规模。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49461519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档