Windows終了時Form_QueryUnloadにcancelを送るには?

解決


ささ  2005-04-25 08:27:24  No: 121255

過去ログなど大変参考にさせていただいています。VB6、WinXPです
フォームを開いたままにしておき、スタートボタンよりWindowsの終了を選んだ際に、ファイルをコピーしてから終了させるという処理を行いたいと思っています。

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

    If UnloadMode = vbAppWindows Then
        Cancel = True
        '//このへんにコピーの処理
    End If

End Sub
        
としているのですが、コピーの量が多いのでWindowsが「このプログラムは応答していません」とメッセージを出してきてしまうのです。
このプロシージャが終わるまでcancelにならないのはなんとなくつかんだんですが、callなどで呼び出したとしてもcancelにならないし…
このプロシージャが終了した後に、他のプロシージャを呼び出す方法も思い浮かびません。

早くcancelを出すか、プロシージャ終了後に処理を行うといった手段がありましたらどうかよろしくお願いいたします。


ガッ  2005-04-25 08:34:43  No: 121256

簡単に思いつく方法としては
1タイマーを使う
2非同期な実行が出来る「何か」を使う。
多分1なら簡単に出来ると思います。
…でも、終了させたいときに「終わらない」のはちょっとデザインとして(orz)な感じです…

※「保存している」と確認できるメッセージを表示するウィンドウでも
  追加してみるのといいかもしれません。
  …それでも私はいやですが(ぇ


ガッ  2005-04-25 08:35:49  No: 121257

ぁ…と、思いついただけでテストしていない、と書くのを忘れました(orz


ささ  2005-04-25 09:03:12  No: 121258

ありがとうございます。
実はどうしてもWin終了時にコピーしなくてはならなくて、しかもスタートボタンから終了を選ばさなければならないのです。
で、思いついた方法が、終了をキャンセルさせてコピーした後に、VBからWindowsをシャットダウンさせる…というものでして。

タイマーを使っても、Form_QueryUnloadがEnd subまでたとりつかないとcancelにならないみたいなんです。

>>※「保存している」と確認できるメッセージを表示するウィンドウでも
こんな感じでしょうか?

    If UnloadMode = vbAppWindows Then
        Cancel = True
        '/コピーの処理
        msgbox "保存してます"
    End If

でもメッセージボックスをOKと押さないとcancelになってないみたいでして。
なにぶん初心者でくわかっていない私ですが、何卒良い方法をよろしくお願いいたします。


ガッ  2005-04-25 19:15:39  No: 121259

頑張っているようなので、コードを投下します。
ノ■ミ

'・フォーム:Form1.frmを作る
'  ・タイマー:Timer1を貼り付ける
Option Explicit

Private Sub Form_Load()
    With Timer1
        .Enabled = False
        .Interval = 1
    End With
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    If UnloadMode <> QueryUnloadConstants.vbFormCode Then
        'Unloadステートメント以外で、
        '自分の破棄が行われそうな場合は、その破棄を中断する。
        Cancel = 1
        Timer1.Enabled = True
    End If
End Sub

Private Sub Timer1_Timer()
    '自分の破棄が外部によって行われた。
    Debug.Print "終了時に一回だけ呼ばれるタイマー"
    '自分を破棄する
    Unload Me
End Sub

※フォームの閉じるボタンを押した場合、
  Timer1_Timer()はちゃんと呼び出されるみたいです。
  …「ウィンドウズの終了」をする実験までやる元気が無かったので、
  もしかしたら、「ウィンドウズの終了」の時はちゃんと動かないかもしれません。


ささ  2005-04-26 07:21:00  No: 121260

ガッさんありがとうございます!
すごい!完璧です!!
私も早くこんな考え方ができるようにがんばります。
自分なりに考えてこんな風にアレンジしてみましたので報告まで。

    If UnloadMode = vbAppWindows Then
        Cancel = 1
        Timer1.Enabled = True
    ElseIf UnloadMode = vbFormCode Then
        Call シャットダウンさせるプロシージャ
    End If
-----------------------------------------------
    Private Sub Timer1_Timer()
        Call コピーをするプロシージャ
        '自分を破棄する
        Unload Me
    End Sub

本当にありがとうございます
                                  //ぬるぽ


ささ  2005-04-26 07:21:52  No: 121261

すんません解決のチェックいれるの忘れてました。orz


ガッ  2005-04-26 07:35:44  No: 121262

最後のぬる○は叩けという指令のよーなので>(  ´Д`)
ノシ<でゎ、さささん頑張ってくださいw


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加