如何停止Explorer启动我的应用程序最大化?

资源pipe理器似乎总是用SW_MAXIMIZE启动我的应用程序(在STARTUPINFO.dwFlags设置了STARTF_USESHOWWINDOW )。 我知道ShowWindow将在你第一次需要显示一个窗口时使用这个值,但是它具有最大化一个永远不会被最大化的窗口的不幸结果。

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

这发生在使用Windows 8.1的HP Stream 7上。 我不确定Explorer是否会执行此操作,因为它是启用了触摸的,或者是因为屏幕较小。

这个资源pipe理器的行为logging在任何地方,有没有办法把它关掉? 停止Explorer(或任何其他父进程)影响我的初始窗口模式的最佳方法是什么? (我不想阻止用SW_*MINIMIZE*启动我的人)

系统32中的WinVer.exe具有相同的问题: 在这里输入图像说明

Solutions Collecting From Web of "如何停止Explorer启动我的应用程序最大化?"

我的第一个想法是关闭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; 

我是几个HP Stream 7平板电脑的自豪的拥有者,我想在这里添加我的2美分。 微软已经作出任意决定,屏幕尺寸小于8英寸的设备将表现不同于标准。 很多用户都知道这一点,但不知道这是你的问题的起源。

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

如果EDID中没有尺寸信息,或者尺寸信息低于微软任意选择的8英寸的阈值,那么这种明显的错误行为至少会让那些注意到它并且不需要它的人感到愤怒。

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

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

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

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

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

可悲的是,微软可以在将来改变这种行为,所以我们不能保证通过同样有缺陷的决策过程来实现这一点,他们不会再次强迫我们的喉咙,使用更困难去抵消方法。