環境
OS : WinXP
VB6.0 を使用
WINDOUS の起動状態を同期をとるような常駐処理を考えております。
起動側は、スタートアップ に EXEファイルを登録することで解決できそうです。
ただ、終了側が検討もつかないような状況です。
具体的には、
Windousのシャットダウンタスクが起動し始めたら、
現状実行している処理を中断させる →
ファイル保存処理を実行 →
ファイル保存を完了したらソフト終了 →
Windowsシャットダウン実行開始
こんなことって可能なのでしょうか?
Form の QueryUnload イベントの引数で判定してみるとか。
魔界の仮面弁士さんありがとうございます。
いつも、他のスレッドにてあなたの意見は参考にさせていただいております。
さて、本題についてですが アドバイスしていただいた内容をもとに
Form の QueryUnload イベントを使用して以下のような仮プロシージャを
作成してみました。
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
'現在の Windows セッションが終了するのを検出
If UnloadMode = vbAppWindows Then
rtn = MsgBox("成功!!", vbOKCancel)
End If
'キャンセル にて現在の Windows セッションが終了するのを中止する(OKなら終了)
If rtn <> vbOK Then
Cancel = 1
End If
End Sub
↑ exeファイルを作成して、起動させてみると
Windousシャットダウン または ログオフ にて メッセージボックス が
表示されます。
( Windousシャットダウン タイミング検出成功 )
かつ、メッセージボックスのボタンを押すことでWindousの終了処理が起動されるようです。
ということで、このメメッセージボックスの箇所を 質問として記載させてもらった
ファイル保存処理に置き換えれば解決??と思われたのですが1点、
問題が発生しました。
上記仮プログラムにてメッセージボックスのコマンドボタンを押さない状態で
しばらく放置しているとソフトの強制終了を促すダイアログボックスが表示され
そこに表示されているゲージがどんどん増えていき、ゲージが満タンになると
強制的に終了処理が始まってしまいます。
つまり、現状のレベルでは シャットダウンを検出して、現状実行している
処理を中断、ファイル保存を実行 とここまでは実現できたのですが、
必ずファイル保存を完了させることができるという保証があくまでないです。
この問題を解決するには、どういった方法をとればよいのでしょうか?
どなたか力を貸してください。
Windows が Windo[U]s になっているのが、非常に気になります…。
それも、一度や二度のミスでは無さそうですし。(^_^;)
それはさておき、そもそも、シャットダウン処理に影響を与えるほど、
重い処理を行おうとしているのでしょうか? であればまずは、
その現状の仕様自体を見直す必要があるかもしれません。
> この問題を解決するには、どういった方法をとればよいのでしょうか?
シャットダウン処理を延期させるという手法があります。
アプリ側でシャットダウン通知を受け取ったら、それをキャンセルさせ、
終了処理を拒否しておきます。その後、自身の「重い処理」とやらを
完全に終わらせてしまい、その後で改めて、シャットダウン処理を
やりなおす…という手順になります。
なお、シャットダウン処理をプログラム側から行うために、
ExitWindowsEx API を用いる事ができます。
魔界の仮面弁士さんありがとうございます。
完全に解決しました。
今自分の書き込んだ内容を読み返してみてびっくりです。
完全に寝ぼけていましたね。
でもこれで眠れない日々から解放されそうな見通しがつきました。
ありがとうございます。
| ツイート |
|