在vb里如果接收到系统退出或关闭的事件

时间:2022-02-03 00:43:53
我做了一个记录上机时间的程序,是随系统启动的,但如何能在系统退出或关闭时让vb记录退出时的时间呢?
试过了用QueryUnload与Terminate()事件,但都不理想。因为好多时候直接关闭系统时vb的程序也跟着关闭了,并没有去触发这一事件执行。

21 个解决方案

#1


http://www.lihuasoft.net/article/show.php?id=34

#2


Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    If MsgBox("现在时间是:" & Now() & " 是否退出?", vbYesNo, "退出确定") = vbYes Then

        Open "c:\a.txt" For Append As #1
        Print #1, CStr(Now())
        Close #1

    Else
        Cancel = 1
    End If

End Sub

自己在C盘目录下建立个a.txt

#3


判断QueryUnload事件中的UnloadMode参数,如果等于4的话就是系统在关机而导致程序退出

#4


看了,等下试试看!
多谢了!

#5


我现在用的就是2楼所说的方法,但不太正常,开始时还可以,后来就不正常了,我用的是英文版的XP,不知是不是调整时区与区域语言所致,反正现在用这些办法就不太理想。
3楼所说的也同样道理,因为我自己用的机子,所以我不会手动去中止我的程序的,但就关机时就是不能正常的触发VB的那个事件,只有在手动中止时那事件才能正常的触发。
你看一下我的记录文件:
Start at: 2008-4-24 11:08:40 
Exit at: 2008-4-24 11:44:52 
Use Time[hh:mm]: [0:37]

Start at: 2008-4-24 13:19:20 
Exit at: 2008-4-24 15:39:16 
Use Time[hh:mm]: [2:21]

Start at: 2008-4-27 22:38:45 
Start at: 2008-4-28 7:16:07 
Start at: 2008-4-28 8:21:14 
Start at: 2008-4-28 9:49:48 
Start at: 2008-4-28 10:17:36 
Exit at: 2008-4-28 11:04:44 
Use Time[hh:mm]: [0:47]

都能正确地记录每次关机的时间的。

我想可能真的要用到1楼所提的,用API函数来截取系统的消息才行了,但这个用vb做得又比较麻烦,倒是用vc好!

#6


前面贴子打溜了,是不能正确记录的

——————————————————
都不能正确地记录每次关机的时间的。

我想可能真的要用到1楼所提的,用API函数来截取系统的消息才行了,但这个用vb做得又比较麻烦,倒是用vc好!
——————————————————

#7


Start at: 2008-4-27 22:38:45  
Start at: 2008-4-28 7:16:07  
Start at: 2008-4-28 8:21:14  
Start at: 2008-4-28 9:49:48  
Start at: 2008-4-28 10:17:36  
Exit at: 2008-4-28 11:04:44  
Use Time[hh:mm]: [0:47]

你start后有什么操作吗?使用的是系统关闭计算机了?那就把代码改下就行了。就想3楼说的。在判断下UnloadMode参数。

#8


我的程序是这样的:
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    WriteRecord (True)‘写当前时间到一文本文件的过程
End Sub

'Private Sub Form_Terminate()
'    WriteRecord (True)‘写当前时间到一文本文件的过程
'End Sub

Private Sub Quit_Click()
    Shell_NotifyIcon NIM_DELETE, nidProgramData
    WriteRecord (True)‘写当前时间到一文本文件的过程
    End
End Sub

但都不能正确地记录关机的时间,当你手动去结束这一程序时才会正常地记录结束程序的时间到那文本文件里。

#9


楼主你好毅力!!!
估计每次测试的时候都要关机..........

#10


的确,我在测试的那天开关机次数在数十次以上。
试得头都发晕了,还是拿不下这个问题!

#11


装个VM吧..

这样太累了

#12


 一般来说,关机或Logff后,Windows会传依序送出WM_QUERYENDSESSION的信息给每个Process,如果中间有一个Process不能顺利结束(例如:Word修改后未存档,而出现是否存档,但我们按取消),这时该信息执行的结果会传回False(0),这时Windows也就不再继续送WM_QUERYENDSESSION给下一个Proccess。如果 在你的进程收到WM_QUERYENDSESSION之前,其它程序不能顺利结束,你在 Form_QueryUnload就收不到消息吧
没有测试,你自己试试吧

#13


你在 Form_Unload() 事件中写代码就是了。

#14


用VM还是更惨,更慢啦!
因为每次都要正常关机才能测试得到那个结果的嘛!

Unload事件我之前是已经测试过的了,没用的,那只是窗体卸载时触发的,这个直接关机是不会有什么反应的。
在正常关机与非正常关机的情况我都试过了,一样的。现在关键的是通过什么方法让系统在关闭时去触发VB里的事件。

#15


能不能调用系统日志?

#16


同意zzyong00说的,消息是关键,找一下MSDN。

#17


估计楼主的确机器还不错,不然每次重起花的时间也够多的

#18


mark

#19


http://www.qudong.com/soft/program/VB/vbshili/20080317/1323.html

#20


处理这个消息WM_QUERYENDSESSION


我N年前弄过。

#21


经测试:
Form_QueryUnload事件、Form_Unload事件,WM_QUERYENDSESSION消息截获 、WM_ENDSESSION消息截获,
以上四种方法里面的代码都会在关机时执行。

我以前的不正常工作是因为用了某些优化软件设置了系统在关机时自动结束所有的任务,并把等待的时间设置行太短了,以致放在上面那些事情里的代码没有足够的时间执行,系统就已经关闭掉了。

多谢各位的鼎力相助!

#1


http://www.lihuasoft.net/article/show.php?id=34

#2


Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    If MsgBox("现在时间是:" & Now() & " 是否退出?", vbYesNo, "退出确定") = vbYes Then

        Open "c:\a.txt" For Append As #1
        Print #1, CStr(Now())
        Close #1

    Else
        Cancel = 1
    End If

End Sub

自己在C盘目录下建立个a.txt

#3


判断QueryUnload事件中的UnloadMode参数,如果等于4的话就是系统在关机而导致程序退出

#4


看了,等下试试看!
多谢了!

#5


我现在用的就是2楼所说的方法,但不太正常,开始时还可以,后来就不正常了,我用的是英文版的XP,不知是不是调整时区与区域语言所致,反正现在用这些办法就不太理想。
3楼所说的也同样道理,因为我自己用的机子,所以我不会手动去中止我的程序的,但就关机时就是不能正常的触发VB的那个事件,只有在手动中止时那事件才能正常的触发。
你看一下我的记录文件:
Start at: 2008-4-24 11:08:40 
Exit at: 2008-4-24 11:44:52 
Use Time[hh:mm]: [0:37]

Start at: 2008-4-24 13:19:20 
Exit at: 2008-4-24 15:39:16 
Use Time[hh:mm]: [2:21]

Start at: 2008-4-27 22:38:45 
Start at: 2008-4-28 7:16:07 
Start at: 2008-4-28 8:21:14 
Start at: 2008-4-28 9:49:48 
Start at: 2008-4-28 10:17:36 
Exit at: 2008-4-28 11:04:44 
Use Time[hh:mm]: [0:47]

都能正确地记录每次关机的时间的。

我想可能真的要用到1楼所提的,用API函数来截取系统的消息才行了,但这个用vb做得又比较麻烦,倒是用vc好!

#6


前面贴子打溜了,是不能正确记录的

——————————————————
都不能正确地记录每次关机的时间的。

我想可能真的要用到1楼所提的,用API函数来截取系统的消息才行了,但这个用vb做得又比较麻烦,倒是用vc好!
——————————————————

#7


Start at: 2008-4-27 22:38:45  
Start at: 2008-4-28 7:16:07  
Start at: 2008-4-28 8:21:14  
Start at: 2008-4-28 9:49:48  
Start at: 2008-4-28 10:17:36  
Exit at: 2008-4-28 11:04:44  
Use Time[hh:mm]: [0:47]

你start后有什么操作吗?使用的是系统关闭计算机了?那就把代码改下就行了。就想3楼说的。在判断下UnloadMode参数。

#8


我的程序是这样的:
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    WriteRecord (True)‘写当前时间到一文本文件的过程
End Sub

'Private Sub Form_Terminate()
'    WriteRecord (True)‘写当前时间到一文本文件的过程
'End Sub

Private Sub Quit_Click()
    Shell_NotifyIcon NIM_DELETE, nidProgramData
    WriteRecord (True)‘写当前时间到一文本文件的过程
    End
End Sub

但都不能正确地记录关机的时间,当你手动去结束这一程序时才会正常地记录结束程序的时间到那文本文件里。

#9


楼主你好毅力!!!
估计每次测试的时候都要关机..........

#10


的确,我在测试的那天开关机次数在数十次以上。
试得头都发晕了,还是拿不下这个问题!

#11


装个VM吧..

这样太累了

#12


 一般来说,关机或Logff后,Windows会传依序送出WM_QUERYENDSESSION的信息给每个Process,如果中间有一个Process不能顺利结束(例如:Word修改后未存档,而出现是否存档,但我们按取消),这时该信息执行的结果会传回False(0),这时Windows也就不再继续送WM_QUERYENDSESSION给下一个Proccess。如果 在你的进程收到WM_QUERYENDSESSION之前,其它程序不能顺利结束,你在 Form_QueryUnload就收不到消息吧
没有测试,你自己试试吧

#13


你在 Form_Unload() 事件中写代码就是了。

#14


用VM还是更惨,更慢啦!
因为每次都要正常关机才能测试得到那个结果的嘛!

Unload事件我之前是已经测试过的了,没用的,那只是窗体卸载时触发的,这个直接关机是不会有什么反应的。
在正常关机与非正常关机的情况我都试过了,一样的。现在关键的是通过什么方法让系统在关闭时去触发VB里的事件。

#15


能不能调用系统日志?

#16


同意zzyong00说的,消息是关键,找一下MSDN。

#17


估计楼主的确机器还不错,不然每次重起花的时间也够多的

#18


mark

#19


http://www.qudong.com/soft/program/VB/vbshili/20080317/1323.html

#20


处理这个消息WM_QUERYENDSESSION


我N年前弄过。

#21


经测试:
Form_QueryUnload事件、Form_Unload事件,WM_QUERYENDSESSION消息截获 、WM_ENDSESSION消息截获,
以上四种方法里面的代码都会在关机时执行。

我以前的不正常工作是因为用了某些优化软件设置了系统在关机时自动结束所有的任务,并把等待的时间设置行太短了,以致放在上面那些事情里的代码没有足够的时间执行,系统就已经关闭掉了。

多谢各位的鼎力相助!