【问题标题】:How do I avoid MDIParent form from resizing如何避免 MDIParent 表单调整大小
【发布时间】:2018-09-02 19:55:55
【问题描述】:

我正在设计一个 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 错误,但对于我的情况,只要屏幕分辨率开始超过 1024(VS 2010),它就已经存在了。我希望这不仅仅是一个 Windows 错误...

【问题讨论】:

    标签: winforms mdichild mdiparent


    【解决方案1】:

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

    功能,不是bug,但不是Winforms程序员非常喜欢的功能。值得注意的是,在过去的几个月里,出现了几个关于神秘的窗口收缩的问题。我认为这与 Win10 Fall Creators 版本的发布有关。它对传统的 Win32 api 层进行了深刻的更改,并引起了很大的动荡。

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

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

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

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

    最后但并非最不重要的一点是,开始创建具有 dpiAware 功能的 Winforms 应用程序变得非常重要,这样这样的错误就永远不会字节。您可以通过declaring your app to be dpiAware 启动它,因此 DPI 虚拟化被禁用。加上您需要在代码中执行的任何操作,以确保 UI 设计正确扩展。

    【讨论】:

    • 感谢汉斯的解释。我按照您的步骤进行操作,但在模块中迷路了...我不知道应该从大约 100 个 dll 列表中删除/卸载哪个文件?
    • 100,哎哟。这就是我推荐使用调试器的原因。您仍然可以通过反复禁用其中一半来解决 100 个问题。 50, 25, 13, 7, 4, 2, 1,最多只有 7 次尝试找到作恶者。二分查找解决一个电脑问题,呵呵。
    • 但是,然后明确回答 stackoverflow.com/questions/13228185/… 你指出我解决了它!
    猜你喜欢
    • 2015-06-02
    • 2015-11-12
    • 2018-04-30
    • 1970-01-01
    • 2013-08-05
    • 2012-11-17
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多