windows - 如何停止资源管理器启动我的应用程序最大化?

标签 windows winapi touch windows-8.1 showwindow

Explorer 似乎总是以 SW_MAXIMIZE 启动我的应用程序(STARTF_USESHOWWINDOWSTARTUPINFO.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也有同样的问题: enter image description here

最佳答案

我的第一个想法是在 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/

相关文章:

c++ - 如何将对 ole32.dll 的调用重定向到我自己的代理 DLL?

swift - 将 Sprite 旋转到一个点并在一段时间内将其移动到该点

iphone - iPhone 的 cocos2D 和触摸检测问题

windows - 为什么我只能在 Windows 上使用 Tie::File 打开 2045 个文件?

c# - 将字节插入文件中间(在 Windows 文件系统中)而不读取整个文件(使用文件分配表)?

python - 为什么这个 python WMI 调用给我一个错误?

c++ - 确定窗口捕捉距离

android - 长按 surfaceView ( android )

python - 如果在 Windows 上导入 python 包,Apache 将无法工作

windows - 如何在 Windows 的命令提示符启动时运行命令