3

エクスプローラーは常にSW_MAXIMIZE(STARTF_USESHOWWINDOWに設定されていますSTARTUPINFO.dwFlags) でアプリケーションを起動するようです。あなた/Windowsがウィンドウを初めて表示する必要があるときShowWindowにこの値を使用することはわかっていますが、最大化してはならないウィンドウを最大化するという残念な結果があります。

私のウィンドウは次のスタイルで作成されCreateDialogIndirectParam、次のスタイルを持っています: WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_CLIPCHILDREN|DS_MODALFRAME|DS_CENTER|WS_VISIBLE. 強制を許可する前に が設定されているShowWindowかどうかを確認しないのはなぜですか? これは Windows のバグですか?WS_MAXIMIZEBOXSTARTF_USESHOWWINDOWSW_MAXIMIZE

これは、Windows 8.1 を搭載した HP Stream 7 で発生します。エクスプローラーがこれを行うのは、タッチが有効になっているためなのか、画面が小さいためなのかわかりません。

このエクスプローラーの動作はどこかに文書化されていますか? また、それをオフにする方法はありますか? Explorer (またはその他の親プロセス) が初期ウィンドウ モードに影響を与えないようにする最善の方法は何ですか? ( で始まる人をブロックしたくありませんSW_*MINIMIZE*)

system32 の WinVer.exe にも同じ問題があります。 ここに画像の説明を入力

4

2 に答える 2

2

私が最初に考えたのは、親が最大化を開始することを望んでいる場合、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;
于 2015-03-08T19:21:12.530 に答える