如何避免 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 表单调整大小 的相关文章

  • 事件处理程序中的“对 SetCurrentCellAddressCore 的可重入调用” - 仅当单元格行索引和列索引相等时

    我正在制作一个 WinForms 应用程序 其中包含一个使用DataGridView处理简单的数据操作 确保准确输入 同时减少混乱 阅读 不使用DataGridViewComboBoxColumn 我有几个事件处理程序可以暂时将DataGr
  • Windows 窗体:显示自适应省略号的单元格换行模式

    我正在使用 Windows 窗体 Datagridview 来显示一些 长 文本 代码是PowerShell 但问题与Cell Wrapping模式有关 TestGridView New Object System Windows Form
  • ScrollableControl 在整个控件周围绘制边框

    我正在构建基于的自定义用户控件ScrollableControl 现在我正在尝试在控件周围添加边框 类似于 DataGridView 的边框 我可以使用以下方法绘制边框 e Graphics TranslateTransform AutoS
  • 如何将DataGridView与SqlDataReader绑定

    任何人都可以在这段代码中帮助我吗 我正在尝试将数据与 datagridview 绑定 查询在 sql server 中返回值 但它没有绑定 DataGridView 中的任何值 private void CheckMembers try s
  • 从任务并行库更新 ProgressBar UI 对象

    基本上我想更新 FormMain WindowsForm 上的 ProgressBar UI 对象 我正在使用 NET 4 0 以下是 Form1 Designer cs 中的代码 namespace ProgressBarApp publ
  • 单击用户控件时如何防止窃取焦点? [复制]

    这个问题在这里已经有答案了 我希望能够单击我的用户控件 而不让它从任何其他控件中窃取焦点 我知道当你点击标签时它不会夺走焦点 如何才能做到这一点 尝试禁用您的控件ControlStyles Selectable http msdn micr
  • 如何使树视图不可折叠?

    使用WinForms中的TreeView控件 是否有一个属性可以设置为隐藏每个节点的折叠节点图标 另外 如何永久展开 TreeView 中的所有节点 你需要处理OnBeforeExpand事件和设置Cancel to true privat
  • 让设计者为 UserControl 的简单 List 属性生成 AddRange

    我创建了一个新的用户控件 如下所示 public partial class MyControl UserControl List
  • 跨线程操作在BackgroundWorker中无效

    我想在数据网格视图中显示有关表单加载的一些数据 我想要显示的数据有大量行 当我使用后台工作处理器时 它向我显示以下错误 My code private void backgroundWorker1 DoWork object sender
  • 滚动时在面板中平滑地绘制或绘制子控件

    在使用 Tab 控件的 TabPage 中的 Panel 控件时 我有很多子控件 如 RichTextBox 按钮 标签等 问题是当我在面板中滚动时 内部会闪烁 子控件没有像它们已经存在一样顺利地显示 淹没 绘制 寻找可以使滚动平滑并消除闪
  • 当 AxWindowsMediaPlayer 关闭时,出现 AccessViolation 异常

    我有一个AxWMPLib AxWindowsMediaPlayer在表格上 当我关闭表单时 我收到 尝试读取或写入受保护的内存 这通常表明其他内存已损坏 例外 隐藏表单可以 但关闭则不行 当组件从表单中删除时 一切都很好 这是Winform
  • 如何获取Winforms窗体标题栏高度的大小?

    因此 如果它是工具窗口或可最小化的表单 我希望能够以编程方式获取其高度 这可能吗 如果是这样怎么办 您可以使用以下方法确定工具窗口和普通表单的标题栏高度 Rectangle screenRectangle this RectangleToS
  • 如何在非托管 ATL GUI 中嵌入 Windows 窗体?

    我有一个使 COM 可见的 Windows 窗体用户控件 现在我想将该控件嵌入到 ATL 对话框 GUI 中 ATL项目 非托管C 只应获取winform的progID并在运行时动态创建和嵌入它 这可能吗 如果可以 我该怎么做 我不确定 A
  • 当我使用 Image.FromFile() 时 FileNotFound

    我在这种情况下使用 Image FromFile string 方法 using System using System Collections Generic using System ComponentModel using Syste
  • 删除DataGridView(表)中的多行

    我有一个数据表 myTable 它与 DataGridView dgv 绑定 DataGridView dgv 有一个复选框列 我的目标是删除在按钮事件中选中的行 数据表当然会更新 现在我的代码仅适用于删除一行 不适用于多行 感谢帮助 pr
  • 键入时自动滚动 DataGridView

    我遇到这个问题 DataGridView 中的最后一列太长 您需要使用滚动条来显示该列的其余部分 但是当我输入文本时 它不会在输入时自动滚动 我想要的是 我想在打字时自动滚动滚动条 以便用户在打字时不必使用滚动条 这是图像 As you c
  • 如何对数据集运行查询?

    我有一个DataSet named dsView包含数据 这是我用来读取 XML 的代码 dsView new DataSet dsView ReadXml c MyXml xml 该数据有一个名为MEN有字段Fname and Lname
  • 如何将行从一个 DataGridView 移动到另一个 DataGridView?

    我有两个具有相同列架构的 DataGridView 尽管两个不同的 DataView 作为数据源 如果这很重要 将行从一个数据网格视图移动到另一个数据网格视图的最佳 最快方法是什么 我相信如果您在 DataTable table1 中有一行
  • InvalidOperationException - 对象当前正在其他地方使用 - 红十字

    我有一个 C 桌面应用程序 其中我连续创建的一个线程从源 实际上是一台数码相机 获取图像并将其放在 GUI 中的面板 panel Image img 上 这必须是另一个线程 如它是控件的代码隐藏 该应用程序可以工作 但在某些机器上 我会在随
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表

随机推荐