アプリケーションXYZがサービスなら、サービスの自動再開の設定で再起動されると思うので、GUIあるいはコンソールアプリケーションだとして。
再起動マネージャーは、lParam パラメーターが ENDSESSION_CLOSEAPP (0x1) に設定されたWM_QUERYENDSESSION通知を送信して、GUI アプリケーションに対してシャットダウンを照会します。
GUI アプリケーションは、WM_QUERYENDSESSIONメッセージをリッスンし、アプリケーションがシャットダウンして再起動する準備ができている場合は TRUE の値を返す必要があります。
アプリケーションが FALSE の値を返さない場合、再起動マネージャーは、lParam パラメーターを ENDSESSION_CLOSEAPP(0x1) に設定し、wparamパラメーターをTRUEに設定して、WM_ENDSESSIONメッセージを送信します。
アプリケーションは、WM_ENDSESSIONメッセージを受信した場合にのみシャットダウンする必要があります。
GUI アプリケーションはWM_ENDSESSION メッセージを受信すると、アプリケーションは、指定されたタイムアウト期間内にシャットダウンするように準備する必要があります。
アプリケーションは、 RegisterApplicationRestart関数を使用して再起動のために登録する必要があります。
再起動マネージャーは、再起動のために登録されているアプリケーションのみを再起動できます。
これは、再起動マネージャーがアプリケーションの再起動時に使用するコマンドラインコマンドを決定する唯一の方法です。
保存された状態またはデータを使用してアプリケーションを再度開く必要がある場合は、その情報をアプリケーションに登録されているコマンドラインコマンドに含める必要があります。
再起動マネージャーは、更新プログラムをインストールするためにシステムの再起動が必要であると判断した場合、アプリケーションとサービスをシャットダウンしません。
WM_ENDSESSIONのENDSESSION_CLOSEAPP
再起動マネージャーは、アプリケーションで置き換える必要があるファイルを使用している場合、システムにサービスを提供する必要がある場合、またはシステム リソースが使い果たされたときに、このメッセージを送信します。 アプリケーションは、 RegisterApplicationRestart関数を使用して再起動するために登録されている場合に再起動されます
更新されるのがWindows アプリケーションの場合、この関数を呼び出す最後の機会は 、WM_QUERYENDSESSION メッセージの処理中です。
更新されるのがコンソール アプリケーションの場合、インストーラーがアプリケーションのシャットダウンを試みる前に登録を行う必要があります
まとめると、
- GUIアプリケーションがWM_QUERYENDSESSIONに対してTRUEを返している場合は、再起動マネージャーはアプリケーションを終了しても良いと判断して、終了させます。
- GUIアプリケーションならWM_QUERYENDSESSIONを検出して処理を抜けるよりも以前に、RegisterApplicationRestartで再起動してほしいことを登録しておく必要がある。(コンソールならCTRL_C_EVENT)
つまり、
- 更新が原因でアプリケーションを終了させられたくなければWM_QUERYENDSESSIONに対してFALSEを返す必要がある。(システムの再起動が必要であるとされる)
- 終了してもいいが再起動してほしいなら、RegisterApplicationRestartは自動的に実行されるものではないので、明示的にアプリケーションで行っておく必要がある。
- RegisterApplicationRestartを行っていないなら再起動されない。
.Net Frameworkのアプリケーションであるならば、OSにインストールされているランタイムに依存しているため、.NetFrameworkのランタイム更新が行われる時にはアプリケーションの終了が必要です。
.Net Core以降でフレームワーク依存(=ランタイムを共有)での配置であるなら、.Net Framework同様に、ランタイム更新時にはアプリケーションの終了が必要です。
.Net Core以降の自己完結型での配置であるなら共有ランタイムを参照しないので、終了の必要はありません。(より低レベルのC++などのランタイム更新の場合には影響は受ける可能性はある)