Private Sub Form_Unload(Cancel As Integer)
If MsgBox("真的退出吗?", vbYesNo) = vbNo Then Cancel = 1
End Sub要求程序在退出时用户必须回答,但在win关机时会应该长时间不回答导致程序无响应而被强行关闭。怎么在不回答的情况下阻止win关机,回答后再关机?
If MsgBox("真的退出吗?", vbYesNo) = vbNo Then Cancel = 1
End Sub要求程序在退出时用户必须回答,但在win关机时会应该长时间不回答导致程序无响应而被强行关闭。怎么在不回答的情况下阻止win关机,回答后再关机?
在一个窗体或应用程序关闭之前发生。当一个 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 是在每个窗体卸载时发生。
Private Sub Form_Unload(Cancel As Integer)
If MsgBox("真的退出吗?", vbYesNo or vbsystemmodal) = vbNo Then Cancel = 1
End Sub '▲▲▲▲▲▲▲▲和yuexb(路人甲)思路一样,但我一直没有确认xp下也可以,98下保证能用。
下面给出答案也可以查看我的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
已经做的相当方便了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
谢谢tanaya(蜡笔小新)!DooDu(杜霖:I want,I can.(MmMVP马甲)) 的方法2000下就过不了,还是关了。