【问题标题】:How to stop Explorer starting my application maximized?如何阻止资源管理器最大化启动我的应用程序?
【发布时间】:2015-05-09 22:26:16
【问题描述】:

Explorer 似乎总是以SW_MAXIMIZE 启动我的应用程序(STARTF_USESHOWWINDOW 设置为STARTUPINFO.dwFlags)。我知道ShowWindow 将使用这个值the first time 你/Windows 需要显示一个窗口,但它具有最大化不应最大化的窗口的不幸后果。

我的窗口是用CreateDialogIndirectParam 创建的,具有以下样式:WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_CLIPCHILDREN|DS_MODALFRAME|DS_CENTER|WS_VISIBLE。为什么ShowWindow 在允许STARTF_USESHOWWINDOW 强制SW_MAXIMIZE 之前不检查是否设置了WS_MAXIMIZEBOX?这是 Windows 中的错误吗?

这发生在装有 Windows 8.1 的 HP Stream 7 上。我不确定 Explorer 这样做是因为它启用了触控还是因为屏幕小。

此 Explorer 行为是否记录在任何地方,是否有办法将其关闭?阻止资源管理器(或任何其他父进程)影响我的初始窗口模式的最佳方法是什么? (我不想阻止以SW_*MINIMIZE* 开头的人)

system32中的WinVer.exe也有同样的问题:

【问题讨论】:

  • 您确定您是直接点击实际的 .exe,而不是点击应用了 “运行:最大化” 设置的快捷方式吗?
  • @RemyLebeau 是的,我直接双击 .exe。即使这是一个快捷方式,我的主要问题仍然适用,如何防止第一次调用 ShowWindow 最大化未设置 WS_MAXIMIZEBOX 的窗口?
  • 因为你的屏幕很小,内存只有1GB。 Windows 启动在此配置中最大化的所有应用程序。
  • @RaymondChen 此功能是否记录在任何地方?有没有办法关掉它?谁认为在窗口恢复后最大化用户无法再次最大化的应用程序是个好主意?这也让应用看起来很愚蠢,因为他们从没想过会发生这种情况......
  • 本意是只最大化可以最大化的应用程序,但ShowWindow 中有一个错误,如果启动信息显示SW_MAXIMIZE,它也会最大化不可最大化的窗口。对不起。您可以通过检测有人尝试最大化启动您的应用程序 (GetStartupInfo) 并首先创建一个虚拟窗口(这将吃掉虚假的最大化)来解决此问题。

标签: windows winapi touch windows-8.1 showwindow


【解决方案1】:

如果家长希望我开始最大化,我的第一个想法是在 PEB 中关闭 STARTF_USESHOWWINDOW,但这太讨厌且没有记录,所以我还没有尝试过。


防止任何类型的大小变化(这对我的应用程序来说是可以的,因为它只是一个“模态”对话框)有点工作:

case WM_WINDOWPOSCHANGING:
  ((WINDOWPOS*)lp)->flags |= SWP_NOSIZE;
  return true;

问题是窗口位置仍然设置为 0 x 0 就像一个最大化的窗口。


更好的解决方案似乎是在 WM_INITDIALOG 之后检测并纠正问题:

case WM_INITDIALOG:
  PostMessage(hDlg, WM_APP, 0, 0);
  break;
case WM_APP:
  if (IsZoomed(hDlg)) ShowWindow(hDlg, SW_SHOWNOACTIVATE);
  break;

【讨论】:

  • 修改PEB好像不起作用,可能内核端有自己的STARTUPINFO副本...
【解决方案2】:

我自豪地拥有几台 HP Stream 7 平板电脑,我想在这里加 2 美分。微软做出了一个武断的决定,即屏幕尺寸小于 8 英寸的设备的行为将与标准不同。很多用户都知道这一点,但没有意识到这是您的问题的根源。

Windows 通过从屏幕读取 EDID 信息来确定屏幕的大小,其中包含大小信息,以厘米为单位。

如果 EDID 中没有尺码信息,或者尺码信息低于 Microsoft 任意选择的 8 英寸阈值,您会得到这种明显的不当行为,这至少会激怒那些注意到它并且不想要它的人.

解决方案是在设备管理器中使用通知 Windows 屏幕实际上是 8 英寸或更大的显示器覆盖默认驱动程序。

为此,您需要首先使用 Deltacast 的 E-EDID 编辑器(免费,我上次查看)等工具从注册表中读取 EDID 信息,然后修改大小值并将修改后的文件保存在您可以保存的位置找到它。

修改并保存 EDID 文件后,从 EnTech 下载 Monitor Asset Manager(也是免费的)并使用它来创建 INF 文件。

创建 INF 文件后,您需要使用高级设置菜单重新启动 Windows 并选择禁用驱动程序签名强制,因为您创建的 INF 文件不会进行数字签名。禁用后,在 Windows 中打开设备管理器并使用您创建的 INF 文件更新显示器的驱动程序。您需要确认您确实想要安装未签名的驱动程序文件。

重新启动,Windows 现在会正常运行,但会发现屏幕键盘现在会显示不同的大小,并且有更多可用选项。

可悲的是,微软将来可以改变这种行为,所以不能保证通过他们最初用来实施这种行为的同样有缺陷的决策过程,他们不会再次强迫我们使用更难对付的方法。

【讨论】:

    猜你喜欢
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多