私も取り組んでいるインストーラーのブートストラップであるアプリケーションに取り組んでいます。アプリケーションは、いくつかの MSI 呼び出しを行って、アプリケーションのメイン ウィンドウであるウィザードをまとめるために必要な情報を取得します。これにより、情報の収集中に進行状況ウィンドウが開き、完了すると消えます。次に、ウィザードがセットアップされ、起動されます。私の問題は、ウィザード (CPropertySheet から派生) が前面に出てアクティブなアプリケーションになりたくないということです。
OnInitDialog() メソッドで次のコードを使用して、前面に表示する問題を解決しました。
SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); // force window to top
SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); // lose the topmost status that the previous line gave us
私の問題は、ウィンドウを自己アクティブ化する方法 (つまり、ウィンドウ自体をフォーカスする方法) をまだ理解していないことです。SetFocus() は、このコンテキストでは機能しません。ウィンドウを強制的に Z オーダーの一番上に移動し、できればできるだけ少ない呼び出しでアクティブにするものが必要です。
私の推測では、最初に MSI 呼び出しによって開かれた進行状況ウィンドウが原因でメイン ウィンドウが台無しになっていると思われますが、そのウィンドウが表示されないようにする方法はありません。また、メイン ウィンドウが表示される前に何が起こっているかをユーザーに知らせるため、これを非表示にしても意味がありません。