Private Sub Form_Unload(Cancel As Integer)
  If MsgBox("真的退出吗?", vbYesNo) = vbNo Then Cancel = 1
End Sub要求程序在退出时用户必须回答,但在win关机时会应该长时间不回答导致程序无响应而被强行关闭。怎么在不回答的情况下阻止win关机,回答后再关机?

解决方案 »

  1.   

    怎么阻止?如果用户不用win关机,直接按restart呢?
      

  2.   

    用模式的MsgBox就可以了。设置msgbox为模式的关键字我忘了,上msdn查一下
      

  3.   

    QueryUnload 事件
          在一个窗体或应用程序关闭之前发生。当一个 MDIForm 对象关闭时,QueryUnload 事件先在 MDI 窗体发生,然后在所有 MDI 子窗体中发生。如果没有窗体取消 QueryUnload 事件,该 Unload 事件首先发生在所有其它窗体中,然后再发生在 MDI 窗体中。当一个子窗体或一个 Form 对象关闭时,在那个窗体中的 QueryUnload 事件先于该窗体的 Unload 事件发生。语法Private Sub Form_QueryUnload(cancel As Integer, unloadmode As Integer)Private Sub MDIForm_QueryUnload(cancel As Integer, unloadmode As Integer)QueryUnload 事件语法包括下列部分:部分 描述 
    cancel 一个整数。将此参数设定为除 0 以外的任何值,可在所有已装载的窗体中停止 QueryUnload 事件,并阻止该窗体和应用程序的关闭。 
    unloadmode 一个值或一个常数,如返回值中所描述的,它指示引起 QueryUnload 事件的原因。 
    返回值unloadmode 参数返回下列值:常数 值 描述 
    vbFormControlMenu 0 用户从窗体上的“控件”菜单中选择“关闭”指令。 
    vbFormCode 1 Unload 语句被代码调用。 
    vbAppWindows 2 当前 Microsoft Windows 操作环境会话结束。 
    vbAppTaskManager 3 Microsoft Windows 任务管理器正在关闭应用程序。 
    vbFormMDIForm 4 MDI 子窗体正在关闭,因为 MDI 窗体正在关闭。 
    vbFormOwner 5 因为窗体的所有者正在关闭,所以窗体也在关闭。 
    这些常数是在对象浏览器中的 Visual Basic (VB) 对象库中列出。说明此事件的典型用法是在关闭一个应用程序之前用来确保包含在该应用程序中的窗体中没有未完成的任务。例如,如果还未保存某一窗体中的新数据,则应用程序会提示保存该数据。当一个应用程序关闭时,可使用 QueryUnload 或 Unload 事件过程将 Cancel 属性设置为 True 来阻止关闭过程。但是,QueryUnload 事件是在任一个卸载之前在所有窗体中发生,而 Unload 是在每个窗体卸载时发生。
      

  4.   

    说明白意思就好说了
    Private Sub Form_Unload(Cancel As Integer)
      If MsgBox("真的退出吗?", vbYesNo or vbsystemmodal) = vbNo Then Cancel = 1
    End Sub                            '▲▲▲▲▲▲▲▲和yuexb(路人甲)思路一样,但我一直没有确认xp下也可以,98下保证能用。
      

  5.   


    下面给出答案也可以查看我的Blog:http://blog.csdn.net/tanaya/archive/2005/05/29/383602.aspx在回调函数中处理两个消息就可以:WM_QUERYENDSESSION WM_ENDSESSION:给出源代码:禁止关闭计算机模块(mStopShutDown.bas),程序:唐细刚 2005-5-29
    -----------------------------------------------------------------
    'mStopShutDown.bas
    模块代码:Private Const GWL_WNDPROC = (-4)
    Private Const WM_ENDSESSION = &H16
    Private Const WM_QUERYENDSESSION = &H11Private WndProc As LongPrivate Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic Sub HookShutDown(ByVal hWnd As Long)
        If WndProc = 0 Then
           WndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)
        End If
    End SubPublic Sub UnHookShutDown(ByVal hWnd As Long)
        If WndProc <> 0 Then
           Call SetWindowLong(hWnd, GWL_WNDPROC, WndProc)
           WndProc = 0
        End If
    End SubPrivate Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        If uMsg = WM_QUERYENDSESSION Then
           WindowProc = False '为0
           Exit Function
        ElseIf uMsg = WM_ENDSESSION Then
           WindowProc = False '为0
           Exit Function
        End If
        WindowProc = CallWindowProc(WndProc, hw, uMsg, wParam, lParam)
    End Function主窗体代码:Private Sub Form_Load()
        Call HookShutDown(Me.hWnd)
    End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        Call UnHookShutDown(Me.hWnd)
    End Sub
      

  6.   


    已经做的相当方便了Private Sub Form_Load()
        Call HookShutDown(Me.hWnd)   '禁止关机
    End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        Call UnHookShutDown(Me.hWnd) '撤销禁止关机
    End Sub
      

  7.   

    仔细看了一下,原来是这样处理的.把我的QQ,IE全关了,只剩下当前窗体没关.原来是消息到这个窗体后,窗体把这个消息给扔掉了,而又没有去调用Windows的默认消息处理函数.痛苦,还要重开IE.....
      

  8.   

    哈哈,要的就是这个效果,拦掉windows就能做很多事情啦!
    谢谢tanaya(蜡笔小新)!DooDu(杜霖:I want,I can.(MmMVP马甲)) 的方法2000下就过不了,还是关了。