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

Windows 如何阻止Explorer最大化地启动我的应用程序?,windows,winapi,touch,windows-8.1,showwindow,Windows,Winapi,Touch,Windows 8.1,Showwindow,Explorer似乎总是使用SW\u MAXIMIZE启动我的应用程序(在中设置了STARTF\u USESHOWWINDOW)。我知道ShowWindow将使用此值来显示窗口,但这会导致一个不应该最大化的窗口最大化 我的窗口是用CreateDialogIndirectParam创建的,具有以下样式:WS_字幕| WS_系统菜单| WS_最小化文件盒| WS_CLIPCHILDREN | DS|u MODALFRAME | DS|u中心| WS|u可见。为什么ShowWindow在允许START

Explorer似乎总是使用
SW\u MAXIMIZE
启动我的应用程序(在中设置了
STARTF\u USESHOWWINDOW
)。我知道
ShowWindow
将使用此值来显示窗口,但这会导致一个不应该最大化的窗口最大化

我的窗口是用
CreateDialogIndirectParam
创建的,具有以下样式:
WS_字幕| WS_系统菜单| WS_最小化文件盒| WS_CLIPCHILDREN | DS|u MODALFRAME | DS|u中心| WS|u可见
。为什么
ShowWindow
在允许
STARTF\u使用ShowWindow
强制
SW\u最大化之前不检查是否设置了
WS\u MAXIMIZEBOX
?这是Windows中的错误吗

这发生在使用Windows 8.1的HP Stream 7上。我不确定Explorer是因为触摸功能还是因为小屏幕才这样做的

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

system32中的WinVer.exe存在相同的问题:

如果家长希望我开始最大化,我的第一个想法是关闭PEB中的
STARTF\u 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中没有尺寸信息,或者尺寸信息低于Microsoft任意选择的8英寸阈值,则会出现这种明显的错误行为,这至少会对那些注意到它并且不想要它的人造成伤害

解决方案是在设备管理器中覆盖监视器的默认驱动程序,该驱动程序通知Windows屏幕实际上为8英寸或更大

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

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

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

重新启动,Windows将正常运行,屏幕键盘将显示不同的大小,并提供更多选项


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

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