8

私も取り組んでいるインストーラーのブートストラップであるアプリケーションに取り組んでいます。アプリケーションは、いくつかの 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 呼び出しによって開かれた進行状況ウィンドウが原因でメイン ウィンドウが台無しになっていると思われますが、そのウィンドウが表示されないようにする方法はありません。また、メイン ウィンドウが表示される前に何が起こっているかをユーザーに知らせるため、これを非表示にしても意味がありません。

4

5 に答える 5

7

フォーカスを盗むことはできません。限目。

このOldNewThingの記事を参照してください。

https://blogs.msdn.microsoft.com/oldnewthing/20090220-00/?p=19083

于 2009-03-27T03:17:19.977 に答える
0

BringWindowToTopまたはSetForegroundWindowには、ウィンドウが他のすべてのウィンドウ(アプリケーション)よりも実際に前面に表示される前に満たす必要のある要件があることがわかります。これらが満たされない場合、Windowsはタスクバーのアプリケーションのアイコンのみを点滅させます。この記事はそれを回避する方法を示していますが、1800情報が指摘しているように、お勧めできません。私はあなたがそれを受け入れる必要があると思います。

于 2009-03-27T03:05:49.973 に答える
0

ShowWindow(youwindow,SW_SHOWNORMAL) は動作しませんか? -ドン

于 2009-03-27T02:50:39.777 に答える