HandlerRoutine 関数で CTRL_CLOSE_EVENT 信号を処理しても、プロセスを終了するかどうかをユーザーに問い合わせるダイアログ ボックスが表示されない

現象
コンソール プロセスは、HandlerRoutine 関数の独自のリストをプロセス内に持っています。
SetConsoleCtrlHandler 関数を呼び出すことによって、呼び出し側コンソール プロセス内の HandlerRoutine 関数のリストに、アプリケーション定義の HandlerRoutine 関数を追加することができます。
※ HandlerRoutine は、アプリケーション側で定義するコールバック関数名のプレースホルダーです。実際の SetConsoleCtrlHandler 関数の第一引数には、アプリケーション側で定義したコールバック関数名を指定します。

SetConsoleCtrlHandler 関数を呼び出したコンソール プロセスは、追加した HandlerRoutine 関数で各種制御信号を受信し、処理することが可能です。
また 、CTRL_CLOSE_EVENT 信号を受信した際に、追加した HandlerRoutine 関数を TRUE でリターンすると、プロセスを終了するかどうかをユーザーに問い合わせるダイアログ ボックスがシステムによって表示されます。
HandlerRoutine Callback Function
http://msdn.microsoft.com/en-us/library/ms683242.aspx

Return TRUE. In this case, no other handler functions are called, and the system displays a pop-up dialog box that asks the user whether to terminate the process.

ところが、Windows Vista 以降のバージョンでは、CTRL_CLOSE_EVENT 信号を受信した際に、追加した HandlerRoutine 関数を TRUE でリターンしても本ダイアログ ボックスが表示されません。
そのため、コンピューターの利用者は、そのコンソールを本当に閉じて良いかどうかを判断する機会を持つことができません。

原因
プロセスを終了するかどうかをユーザーに問い合わせるダイアログ ボックスは、Win32 サブシステムの CSRSS.exe (Client Server Runtime Subsystem) プロセスが表示する設計になっています。
ところが、Windows Vista 以降のバージョンでは CSRSS.exe に問題があるため、CTRL_CLOSE_EVENT 信号を受信した HandlerRoutine 関数が TRUE をリターンしても、本ダイアログ ボックスは表示されません。
解決方法
CTRL_CLOSE_EVENT 信号を受信した HandlerRoutine 関数が TRUE をリターンした際に、プロセスを終了するかどうかをユーザーに問い合わせるダイアログ ボックスを表示する方法はありません。
状況
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。
注意 : これは、マイクロソフトのサポート組織内で直接作成された "緊急公開" の資料です。 この資料には、確認中の問題に関する現状ベースの情報が記載されています。 情報提供のスピードを優先するため、資料には誤植が含まれる可能性があり、予告なしに随時改定される場合があります。 その他の考慮事項については、使用条件を参照してください。
プロパティ

文書番号:2607828 - 最終更新日: 09/29/2016 14:25:00 - リビジョン: 3.0

Windows Vista Enterprise, Windows Vista Ultimate, Windows Vista Business, Windows Vista Home Premium, Windows Vista Home Basic, Windows Server 2008 Enterprise, Windows Server 2008 Datacenter, Windows Server 2008 Standard, Windows 7 Enterprise, Windows 7 Ultimate, Windows 7 Professional, Windows 7 Home Premium, Windows 7 Home Basic, Windows Server 2008 R2 Enterprise, Windows Server 2008 R2 Datacenter, Windows Server 2008 R2 Standard

  • kbbug KB2607828
フィードバック