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也有同样的问题:
最佳答案
我的第一个想法是在 PEB 中关闭 STARTF_USESHOWWINDOW
如果 parent 希望我开始最大化,但那太讨厌而且没有记录,所以我还没有尝试过。
防止任何类型的大小更改(这对我的应用程序来说是可以的,因为它只是一个“模态”对话框)的工作:
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;
关于windows - 如何停止资源管理器启动我的应用程序最大化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28930582/