首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 在vb里如果接收到系统退出或关闭的事件 [已结贴,结贴人:jameslan520]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 10:24:52 楼主
    我做了一个记录上机时间的程序,是随系统启动的,但如何能在系统退出或关闭时让vb记录退出时的时间呢?
    试过了用QueryUnload与Terminate()事件,但都不理想。因为好多时候直接关闭系统时vb的程序也跟着关闭了,并没有去触发这一事件执行。
    10  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 10:38:051楼 得分:3
    http://www.lihuasoft.net/article/show.php?id=34
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 10:59:412楼 得分:3
    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
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Sandrer
    • 等级:
    发表于:2008-05-20 11:10:023楼 得分:0
    判断QueryUnload事件中的UnloadMode参数,如果等于4的话就是系统在关机而导致程序退出
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 11:13:334楼 得分:0
    看了,等下试试看!
    多谢了!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 11:25:305楼 得分:0
    我现在用的就是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好!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 11:39:366楼 得分:0
    前面贴子打溜了,是不能正确记录的

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

    我想可能真的要用到1楼所提的,用API函数来截取系统的消息才行了,但这个用vb做得又比较麻烦,倒是用vc好!
    ——————————————————
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 11:47:187楼 得分:0
    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参数。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 11:54:538楼 得分:0
    我的程序是这样的:
    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

    但都不能正确地记录关机的时间,当你手动去结束这一程序时才会正常地记录结束程序的时间到那文本文件里。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Sandrer
    • 等级:
    发表于:2008-05-20 16:45:229楼 得分:0
    楼主你好毅力!!!
    估计每次测试的时候都要关机..........
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-20 17:16:0010楼 得分:0
    的确,我在测试的那天开关机次数在数十次以上。
    试得头都发晕了,还是拿不下这个问题!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • myjian
    • 等级:
    发表于:2008-05-21 14:40:3011楼 得分:0
    装个VM吧..

    这样太累了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 15:17:3812楼 得分:2
     一般来说,关机或Logff后,Windows会传依序送出WM_QUERYENDSESSION的信息给每个Process,如果中间有一个Process不能顺利结束(例如:Word修改后未存档,而出现是否存档,但我们按取消),这时该信息执行的结果会传回False(0),这时Windows也就不再继续送WM_QUERYENDSESSION给下一个Proccess。如果 在你的进程收到WM_QUERYENDSESSION之前,其它程序不能顺利结束,你在 Form_QueryUnload就收不到消息吧
    没有测试,你自己试试吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 15:26:2613楼 得分:1
    你在 Form_Unload() 事件中写代码就是了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 15:42:1914楼 得分:0
    用VM还是更惨,更慢啦!
    因为每次都要正常关机才能测试得到那个结果的嘛!

    Unload事件我之前是已经测试过的了,没用的,那只是窗体卸载时触发的,这个直接关机是不会有什么反应的。
    在正常关机与非正常关机的情况我都试过了,一样的。现在关键的是通过什么方法让系统在关闭时去触发VB里的事件。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 22:10:5715楼 得分:0
    能不能调用系统日志?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-22 14:15:4116楼 得分:0
    同意zzyong00说的,消息是关键,找一下MSDN。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-22 16:46:2817楼 得分:0
    估计楼主的确机器还不错,不然每次重起花的时间也够多的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-22 19:29:5718楼 得分:0
    mark
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-22 22:12:5019楼 得分:0
    http://www.qudong.com/soft/program/VB/vbshili/20080317/1323.html
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-23 09:40:1920楼 得分:1
    处理这个消息WM_QUERYENDSESSION


    我N年前弄过。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-02 22:04:0221楼 得分:0
    经测试:
    Form_QueryUnload事件、Form_Unload事件,WM_QUERYENDSESSION消息截获 、WM_ENDSESSION消息截获,
    以上四种方法里面的代码都会在关机时执行。

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

    多谢各位的鼎力相助!
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    世纪乐知(北京)网络技术有限公司 版权所有 京 ICP 证 020026 号
    Copyright © 2000-2007, CSDN.NET, All Rights Reserved