■まず、シャットダウンやリブートの手法をおこなう
API関数 ExitWindowsEx を通常使用する。ただし、「SE_SHUTDOWN_NAME 特権を持っていなければなりません。」とMSDNに書いてあるので、それをした後、に発行する必要ある。
この時、各アプリに終了通知メッセージが流れ、シャットダウンをキャンセルされる恐れがある。
しかし、ExitWindowsExの解説を読んでみると、
ExitWindowsEx 関数は、シャットダウンの処理を開始し、すぐに制御を返します。シャットダウン処理は、非同期的に実行されます。
Windows システムは、シャットダウンされるアプリケーションに、シャットダウン要求に応答するための所定の時間を与えます。その時間が過ぎても応答がない場合は、ダイアログボックスを表示し、そのアプリケーションを強制的に終了させるか、シャットダウンを再試行するか、シャットダウンを中止するかをユーザーに尋ねます (EWX_FORCE フラグが指定されているときを除く)。
と書いてある、ならば、EWX_FORCEを追加すれば良いのかな?
できるじゃん!
拍子抜けするくらい簡単にできました。TerminateProcess APIを使用しないといけないかとおそれていましたが、OKですね。
■メッセージボックスが表示されている最中でもできるのかな〜?
できるじゃん!
とにかく、強制的に落とせるみたいですね。ニヒィ!
この機能を使用する場面では、システムメッセージモーダルメッセージボックスを出して、
「今から落とすので、アプリケーションを終了した後、OKボタンを押して下さい」
を表示後、落とすつもりである。
システムモーダルメッセージボックスを出している間に、他の業務は操作できるのかサンプル実装してみましょう!
MsgBox("実行するぞ!", vbOKCancel + vbExclamation + vbSystemModal)
システム モーダルに設定します。メッセージ ボックスに応答するまで、すべてのアプリケーションが中断されます。
と、ヘルプには書いてありますが、嘘ですね。中断されずに、できます。しかし、メッセージボックスが必ず上に出ている状態になります。このメッセージボックスがジャマなので、場所を移動しようとすると、このメッセージボックスを表示したプロセスがアクティブになってしまいます。これも少しうっとうしい。
フラグに、VbMsgBoxSetForeground っていうのがあります。
「最前面のウィンドウとして表示します。」
vbSystemModalと、どうちがうのでしょうか?
調べてみましょう。
ダメじゃん!
プロセス内でしか、TOPに来ないではないですか。。。
これは、あきらめるしかないみたいですね〜
2002/11/13