■まず、シャットダウンやリブートの手法をおこなう

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